【问题标题】:Deserialization without decorators没有装饰器的反序列化
【发布时间】:2018-12-04 12:53:36
【问题描述】:

我有几个成员的简单类,比如说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")] 之类的装饰器将成员标记为反序列化?

谢谢!

【问题讨论】:

  • 不确定我是否理解这个问题。有没有看xml,有什么不对的地方吗?
  • 一切都是正确的。我只是想知道 XML 反序列化器如何知道变量的名称,我想装饰器是为此目的而存在的。很久以前我在玩 C#,我记得我必须放置装饰器才能正确解析“反序列化”XML,变量名还不够。
  • 属性必须是公开的才能序列化。

标签: c# xml serialization deserialization decorator


【解决方案1】:

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

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

来源:Microsoft Docs

XmlElement attribute 通常用于为类中的成员(或类本身)提供替代名称,以 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 可能非常有用。您可以在official docs 中了解更多信息。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多