簡體   English   中英

XML序列化Enum類型屬性

[英]XML serializing Enum type properties

我正在嘗試對包含枚舉屬性的類進行XML序列化。 如果使用特定的枚舉來聲明該屬性,則可以正常工作。 但是我需要將該屬性設置為Enum類型,因此可以將其設置為不同的枚舉類型。 但是,這樣做時會出現異常。

在此上下文中,不能使用類型[namespace] .Simple。

我在枚舉定義中嘗試了不同的屬性,但到目前為止還沒有正確。 有沒有辦法做到這一點?

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

public class Foo
{
    public Enum Simple { get; set; }
}

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

Enum是抽象的,無法序列化。 這個答案提出了一種可能的解決方法。

enum的通用基本類型為int (默認情況下,例如也可以是字節或長int )。
因此,您也可以簡單地使用此整數基類型,例如Foo類中的byte Simple

如果您需要將字符串表示形式顯示在xml中(與枚舉字段名稱相同),請將其表示為string Simple

您可以嘗試在要序列化的DataContract上設置EnumMember屬性,有關更多特定信息,請訪問https://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.enummemberattribute(v=vs.110 ).aspx

基於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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM