首页 > 解决方案 > 没有装饰器的反序列化

问题描述

我有几个成员的简单类,比如说String namelist<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")]

谢谢!

标签: c#xmlserializationdeserializationdecorator

解决方案


我不确定以前的版本,但由于 .Net Framework 4.5,XmlSerializer使用此属性 ( XmlElementAttribute) 来控制 xml 序列化。反序列化过程不需要它。

默认情况下,XML 元素名称由类或成员名称确定。在一个名为 Book 的简单类中,名为 ISBN 的字段将生成一个 XML 元素 tag 。

来源:微软文档

当您想为类中的成员(或类本身)提供一个替代名称时,通常会使用该XmlElement属性,该名称以 xml 格式表示该元素。

例如,这个类:

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

正如你所使用的那样:

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

应序列化为

<我的班级>
    <姓名>彼得</姓名>
</我的班级>

XmlElementAttribute但是,您可以通过为 xml 格式的属性提供另一个名称来控制 xml 输出。像这样:

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

那么输出应该是这样的:

<我的班级>
    <用户名>彼得</用户名>
</我的班级>

还有其他属性可以帮助控制 xml 反序列化DefaultValueXmlIgnore这可能非常有用。您可以在官方文档中阅读更多相关信息。

我希望它有所帮助。


推荐阅读