c# - 没有装饰器的反序列化
问题描述
我有几个成员的简单类,比如说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")]
?
谢谢!
解决方案
我不确定以前的版本,但由于 .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 反序列化DefaultValue
,XmlIgnore
这可能非常有用。您可以在官方文档中阅读更多相关信息。
我希望它有所帮助。
推荐阅读
- angular - 'ngx-avatar' 不是已知元素
- reference - Latex:在同一位置引用同名作者的两篇参考文献时如何避免省略作者姓名
- javascript - 我想将 JSON 数据从 json 文件调用到 html 表
- r - 在没有 NA 值的数据框中组合两列
- python-3.x - VSCode + Python 3.7.6 注解@pytest.mark.xfail undefined
- javascript - 如何在地图函数中的反应js中获取两个不同日期之间的天数?
- swift - UIApplication.shared.open ,快速完成一次连接处理
- python - 如何在数据框中以组为基础应用 Wasserstein 距离度量
- javascript - 将对象内部的变量用于其他变量
- java - Json 文件作为 TestNG 中的数据提供者