如何在 C# 中将 XMLSerialize 用于枚举类型的属性?

Posted

技术标签:

【中文标题】如何在 C# 中将 XMLSerialize 用于枚举类型的属性?【英文标题】:How do you use XMLSerialize for Enum typed properties in c#? 【发布时间】:2011-01-19 08:42:13 【问题描述】:

我有一个简单的枚举:

enum simple 
 
  one, 
  two, 
  three 
;

我还有一个具有simple 类型属性的类。我尝试用属性来装饰它:[XmlAttribute(DataType = "int")]。但是,当我尝试使用 XmlWriter 对其进行序列化时,它会失败。

这样做的正确方法是什么?我是否必须标记枚举本身以及属性,如果需要,使用哪种数据类型?

【问题讨论】:

【参考方案1】:

根据 Darin Dimitrov 的回答 - 我要指出的唯一一点是,如果您想控制枚举字段的序列化方式,那么您可以使用 XmlEnum 属性装饰每个字段。

public enum Simple

      [XmlEnum(Name="First")]
      one,
      [XmlEnum(Name="Second")]
      two,
      [XmlEnum(Name="Third")]
      three,

【讨论】:

请不要忘记使用 [Serializable] 属性标记枚举。 @Anton,如果该类已经被标记为可序列化怎么办?我们还需要将 ENUM 单独标记为可序列化吗? 我按照您的方法以及上面的代码进行了操作;但我仍然在 VB.net 代码中遇到以下错误。 Enum underlying type and the object must be same type or object. Type passed in was 'System.String'; the enum underlying type was 'System.Int32'. 课堂上没什么特别的......只是一个具有一个属性和一个枚举的测试类。【参考方案2】:

序列化枚举属性应该没有任何问题:

public enum Simple  one, two, three 

public class Foo

    public Simple Simple  get; set; 


class Program

    static void Main(string[] args)
    
        using (var writer = XmlWriter.Create(Console.OpenStandardOutput()))
        
            var foo = new Foo
            
                Simple = Simple.three
            ;
            var serializer = new XmlSerializer(foo.GetType());
            serializer.Serialize(writer, foo);
        
    

产生:

<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Simple>three</Simple>
</Foo>

【讨论】:

这可行,但它使枚举属性成为元素而不是属性。当我尝试使其成为属性时,它失败了。有什么建议吗? 尝试用 XmlAttribute 装饰属性:[XmlAttribute("simple")]public Simple Simple get; set; 物业似乎无法装饰。仅限字段,对吗? 我可能有一个相关的问题 - 我使用了 generate-classes-from-schema tool(不是 xsd),它可能过度(低于?)归因于属性,因为在我的情况下,枚举属性不是被包含在序列化中。他们

以上是关于如何在 C# 中将 XMLSerialize 用于枚举类型的属性?的主要内容,如果未能解决你的问题,请参考以下文章

在 c# 中将 WhereIf 用于多个条件

找不到使用 C# 在 openGL 中将纹理应用于 3d 对象的方法

如何在 C# 中将 HtmlEncode/HtmlDecode 转换为纯文本?

如何在 C# 中将 IPv4 地址转换为整数?

如何在 C# Nest 中将日期值发送到 elasticsearch 聚合查询

XmlSerialize