XML序列化枚举类型属性

时间:2018-04-05 12:22:46

标签: c# xml serialization enums

我正在尝试XML序列化包含枚举属性的类。如果使用特定的枚举声明属性,它就可以正常工作。但我需要属性为Enum类型,所以我可以将它设置为不同的枚举类型。但是,这样做时我会遇到异常。

  

类型[namespace] .Simple可能不会在此上下文中使用。

我在枚举定义上尝试了不同的属性,但到目前为止还没有完成。有没有办法做到这一点?

Private Sub ResetControl(ByVal sender As Object, ByVal e As EventArgs)
    Dim _UserControl As UserControl1 = CType(Me.Control, UserControl1)
    Dim _PropertyDescriptor As PropertyDescriptor = TypeDescriptor.GetProperties(_UserControl)("BackColor")
    _PropertyDescriptor.ResetValue(_UserControl)
End Sub

3 个答案:

答案 0 :(得分:1)

Enum是抽象的,无法序列化。可能的解决方法见this answer

enum的通用基本类型是int(默认情况下,也可以是字节或长整数)。
所以你也可以简单地使用这个整数基类型,比如byte Simple类中的Foo

如果您需要字符串表示形式出现在xml中(与枚举字段名称相同),请将其公开为string Simple

答案 1 :(得分:1)

您可以尝试在DataContract上设置要序列化的EnumMember attrubute,以获取更具体的信息访问 https://msdn.microsoft.com/en-us/library/system.runtime.serialization.enummemberattribute(v=vs.110).aspx

答案 2 :(得分:0)

基于dlatikay关于将枚举分为枚举类型和成员名称的两个字符串的想法,我提出了以下解决方案。该示例将Foo对象转换为XML字符串,然后再转换回新的Foo对象。

public enum SimpleEnum : byte
{
    one = 0x01,
    two = 0x02,
    three = 0x03
}

public class Foo
{
    private Enum _simple;
    [XmlIgnore]
    public Enum Simple
    {
        get { return _simple; }
        set {
            _simple = value;
            var type = Simple.GetType();
            var underlyingType = Enum.GetUnderlyingType(type);
            EnumType = Simple.GetType().FullName;
            EnumMember = Simple.ToString();
        }
    }

    private string _enumType;
    public string EnumType
    {
        get { return _enumType; }
        set { _enumType = value; }
    }

    private string _enumMember;
    public string EnumMember
    {
        get { return _enumMember; }
        set {
            _enumMember = value;
            _simple = (Enum)Enum.Parse(Type.GetType(EnumType), EnumMember);
        }
    }
}

public class Program
{
    static void Main(string[] args)
    {
        var str = new StringBuilder();
        using (var writer = XmlWriter.Create(str))
        {
            try
            {
                var foo = new Foo
                {
                    Simple = SimpleEnum.three
                };
                var serializer = new XmlSerializer(typeof(Foo));
                serializer.Serialize(writer, foo);
                Console.WriteLine(str.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        using (TextReader reader = new StringReader(str.ToString()))
        {
            try
            {
                var serializer = new XmlSerializer(typeof(Foo));
                var foo = (Foo)serializer.Deserialize(reader);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        Console.ReadLine();
    }
}