2012-10-24 143 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 –