您确实看到了一个序列化错误。
这真的归结为设计偏好。开发人员决定他们不想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
ing 只指定Foo
需要出现在 之前,而Bar
不是Foo
需要是第 10 个元素并且Bar
需要是第 5 个。我认为这使反序列化器更加灵活。