Десериализация без декораторов - PullRequest
0 голосов
/ 26 июня 2018

У меня есть простой класс с несколькими членами, скажем, String name и list<String> friends.После создания экземпляра класса я хочу сериализовать объект и десериализовать его обратно:

        //serialize
        myClass mine = new myClass();
        mine.name = "Peter";
        var xmls = new XmlSerializer(typeof(myClass));

        using (System.IO.FileStream file = System.IO.File.Create(path))
        {
            xmls.Serialize(file, mine);
        }

        //deserialize
        var xmls = new XmlSerializer(typeof(myClass));
        using (System.IO.FileStream file = System.IO.File.Open(path, System.IO.FileMode.Open))
        {
            myClass mine = (myClass) xmls.Deserialize(file);
            Console.writeline(mine.name);
        }

Процесс десериализации работает хорошо, что меня немного удивляет, так как я ожидал, что мне нужны декораторы дляэлементы XML.Что за взлом?Это потому, что я не использую другие переменные в своем классе?Когда участники должны быть отмечены для десериализации с помощью декораторов, таких как [XmlElement("Name")]?

Спасибо!

1 Ответ

0 голосов
/ 26 июня 2018

Я не уверен насчет предыдущих версий, но, начиная с .Net Framework 4.5, XmlSerializer использует этот атрибут (XmlElementAttribute) для управления сериализацией xml.Это не требуется для процесса де / сериализации.

По умолчанию имя элемента XML определяется именем класса или члена .В простом классе с именем Book поле ISBN создаст тег элемента XML.

Источник: Документы Microsoft

ЧастоXmlElement атрибут используется, когда вы хотите дать альтернативное имя для члена вашего класса (или самого класса), который представляет этот элемент в формате xml.

Например, этот класс:

public class MyClass
{
    public string Name { get; set; }
}

, как вы его использовали:

var mine = new MyClass();
mine.Name = "Peter";
...
xmls.Serialize(file, mine);

должен быть сериализован как

<MyClass>
    <Name>Peter</Name>
</MyClass>

Bu youможет управлять выводом xml с помощью XmlElementAttribute, присваивая другое имя свойству в формате xml.Например:

public class MyClass
{
    [XmlElement("UserName")]
    public string Name { get; set; }
}

Тогда выходные данные должны выглядеть следующим образом:

<MyClass>
    <UserName>Peter</UserName>
</MyClass>

Существуют другие атрибуты, которые помогают управлять XML / сериализацией как DefaultValue и XmlIgnore, которыеможет быть довольно полезнымВы можете прочитать больше об этом в официальных документах .

Надеюсь, это поможет.

...