Сериализация имен элементов XML как перечисление в DotNet XmlSerializer - PullRequest
0 голосов
/ 26 декабря 2018

Есть ли способ, с атрибутами (или другим способом), убедить .NET XmlSerializer де / сериализовать перечисление класса в имя элемента, который его представляет, и наоборот?

Пример:

<root>
                <a>4</a>
                <b>5</b>
                <c>6</c>
</root>

[Serializable]
public enum NameEnum { a,b,c }

[Serializable]
public class Class {
                public NameEnum Name {get;set;}
                public int Value {get;set;}
}

1 Ответ

0 голосов
/ 29 декабря 2018

Вы должны сделать это:

using System.Xml.Serialization;


[Serializable]
public enum NameEnum
{
    [XmlEnum(Name = "a")]
    a,
    [XmlEnum(Name = "b")]
    b,
    [XmlEnum(Name = "c")]
    c
}

Рабочий пример, добавить в консольное приложение:

class Program
    {
        static void Main(string[] args)
        {
            AClass c = new AClass();
            c.Name = NameEnum.c;
            c.Value = 2;

            using (MemoryStream ms = new MemoryStream())
            {
                XmlSerializer s = new XmlSerializer(typeof(AClass));
                s.Serialize(ms, c);
                File.WriteAllBytes(@"c:\test\serializeEnum.xml", ms.ToArray());

            }

            using (MemoryStream ms2 = new MemoryStream(File.ReadAllBytes(@"c:\test\serializeEnum.xml")))
            {
                XmlSerializer xs = new XmlSerializer(typeof(AClass));
                AClass t = (AClass)xs.Deserialize(ms2);
                Console.WriteLine(t.Name.ToString());
                Console.WriteLine(t.Value.ToString());
                Console.ReadLine();
            }


        }
    }

    [Serializable]
    public enum NameEnum
    {
        [XmlEnum(Name = "a")]
        a,
        [XmlEnum(Name = "b")]
        b,
        [XmlEnum(Name = "c")]
        c
    }

    [Serializable]
    public class AClass
    {
        public NameEnum Name { get; set; }
        public int Value { get; set; }
    }
...