有人可以解释我为什么会得到以下结果吗?
应该实例化的类:
[System.SerializableAttribute()]
public class SampleClass
{
[System.Xml.Serialization.XmlElementAttribute(Order = 10)]
public string Foo { get; set; }
[System.Xml.Serialization.XmlElementAttribute(Order = 5)]
public string Bar { get; set; }
}
用于反序列化的XML:
<?xml version="1.0" encoding="utf-8" ?>
<SampleClass>
<Foo>Test1</Foo>
<Bar>Test2</Bar>
</SampleClass>
我在反序列化的类中看到Foo = Test1(正确)和Bar = null(不正确)。
这完全是关于Order
属性的。它故意设置为错误的值。如果值为0和1,则一切正常。
Name
和Order
条件对于这两个字段都不匹配,但由于某种原因,一个字段被反序列化而第二个字段没有。我希望看到Exception
或两个值= null或两个字段都已解析和反序列化。
有没有解释?
答案 0 :(得分:4)
您确实看到了序列化错误。
真正归结为设计偏好。开发人员决定他们不想except
并中止整个反序列化过程,而是通知并继续。
使用您的XML。
<?xml version="1.0" encoding="utf-8" ?>
<SampleClass>
<Foo>Test1</Foo>
<Bar>Test2</Bar>
</SampleClass>
考虑使用此代码对其进行反序列化。
XmlSerializer xs = new XmlSerializer(typeof(SampleClass));
XmlDeserializationEvents events = new XmlDeserializationEvents();
events.OnUnknownAttribute = (sender, e) => Debug.WriteLine("Unknown Attributed");
events.OnUnknownElement = (sender, e) => Debug.WriteLine("Unknwon Element");
events.OnUnknownNode = (sender, e) => Debug.WriteLine("Unknown Node");
events.OnUnreferencedObject = (sender, e) => Debug.WriteLine("Unreferenced Object");
SampleClass cs_de = (SampleClass)xs.Deserialize(XmlReader.Create(new StringReader(xml)), events);
Debug.WriteLine(cs_de.Foo);
Debug.WriteLine(cs_de.Bar);
当我使用正确的订购时。
[System.Xml.Serialization.XmlElementAttribute(Order = 0)]
public string Foo { get; set; }
[System.Xml.Serialization.XmlElementAttribute(Order = 1)]
public string Bar { get; set; }
我的输出是
Foo
Bar
当我使用错误的订购时。
[System.Xml.Serialization.XmlElementAttribute(Order = 10)]
public string Foo { get; set; }
[System.Xml.Serialization.XmlElementAttribute(Order = 5)]
public string Bar { get; set; }
我的输出是
Unknown Node
Unknwon Element
Foo
为什么Foo
打印出来?我的理解是Order
不索引。 Order
仅指定Foo
需要在Bar
之前显示,而不是Foo
需要是第10个元素而Bar
需要是第5个元素。我认为这使得解串器更加灵活。