【问题标题】:When serializing/deserializing XML data, do the XML elements and the class attributes have the same name?序列化/反序列化 XML 数据时,XML 元素和类属性是否同名?
【发布时间】:2010-01-03 22:14:50
【问题描述】:
例如:
这是一个简单的类。
class Hero
{
public string faction;
public string name;
public HeroType herotype;
}
这是对应的 XML。
<Hero>
<android>
<Faction>evil</Faction>
<nombre>android</nombre>
</android>
</Hero>
属性是否必须完全相同才能序列化信息?
我的主要目的是使用我的 XML 文件中的信息将信息“加载”到 Hero 类。
【问题讨论】:
标签:
c#
xml
serialization
xml-serialization
【解决方案1】:
您可以使用 [XmlElement(...)] 来装饰您的字段以指定备用名称。它们也不必处于相同的顺序。但是您指定的 Xml 不适合您指定的类的结构。
将您的 Xml 修改为以下内容:
<Hero>
<Name>android</Name>
<Faction>evil</Faction>
<HeroType>Agility</HeroType>
</Hero>
【解决方案2】:
除非您另外指定(如 Aviad P. 所说,通过使用 [XmlElement()] 属性装饰属性),XML 中的名称将与属性名称完全匹配,反之亦然。
排序应该是微不足道的。我说“应该”是因为它实际上是否 无关紧要取决于你如何设计你的课程。
虽然一般来说让属性设置器没有副作用是一种很好的做法,但在处理 XML 反序列化时,它是必不可少的。在反序列化期间,属性将按照它们在 XML 中出现的顺序设置为其值。
所以如果你有这个类:
public class Test
{
private string _Foo;
public string Foo { set { _Foo = value; _Baz="Foo"; } get { return _Foo; }}
private string _Bar;
public string Bar { set { _Bar = value; _Baz="Bar"; } get { return _Bar; }}
private string _Baz;
public string Baz { set { _Baz = value; } get { return _Baz; }}
}
然后Foo 出现在Bar 之前的XML 将Baz 设置为“Foo”,而Bar 出现在Foo 之前的XML 将Baz 设置为“Bar”。