1

谁能解释为什么我在下面得到结果?

应该实例化的类:

[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,则一切正常。

NameOrder标准不匹配两个字段,但由于某种原因,一个字段被反序列化,而第二个字段不被反序列化。我宁愿看到Exception或两个值 = null 或两个字段都已解析和反序列化。

对此有什么解释吗?

4

1 回答 1

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不是索引Ordering 只指定Foo需要出现在 之前,而Bar不是Foo需要是第 10 个元素并且Bar需要是第 5 个。我认为这使反序列化器更加灵活。

于 2012-10-24T18:48:33.987 回答