2012-10-24 112 views
1

任何人都可以解释为什么我得到的结果如下?为什么XmlSerializer.Order这样做

类将被初始化:

[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> 

我看到美孚= Test1的(正确的)和酒吧= NULL(不正确)在去串行化类。

这是关于Order的全部属性。这是故意设置为错误的值。一切工作正常,如果值为0和1.

NameOrder标准不匹配的两个领域,但由于某种原因一个字段是反序列化,而第二个没有。我宁可期望看到Exception或两个值=空或两个字段解决和反序列化。

对此有任何解释吗?

+1

您是不是要这样做? 'XmlSerializer(Order = 10)' – climbage

+1

没有XmlSerializer属性。 –

+0

所以你的问题是:我故意做错了,但是想知道为什么它的行为与我预期的不同? – RobH

回答

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 ing仅指定Foo需要在Bar之前出现,而不是Foo需要是第10个元素并且Bar需要是第5个。我认为这使得解串器更加灵活。

+0

感谢您的帮助。这部分回答了我的问题。仍然在寻找另一部分的答案 - 你知道为什么Foo是反序列化的,即使它有错误的顺序(与Bar相同)。我希望看到更一致的行为(两个领域都失败了)。 –

+0

@DmitryHarnitski在底部查看我的编辑。我不明白这是不是一致的,只是不符合你的预期。 – climbage

+0

评论仍然不能解释结果。两个元素都有指定的顺序。 Class中的字段数量等于XML中元素的数量。所以结果应该是Bar = Test1(因为5在10之前)并且Foo = Test2 –