2010-02-28 26 views
5

我說得對理解.NET XmlIgnoreAttribute,它說:XmlIgnoreAttribute,僅在序列化期間使用,而不是在反序列化期間使用?

指示的XmlSerializer的Serialize方法不序列化公共字段或公共讀/寫屬性值。

說:

  • 的財產將被反序列化,如果存在XML文件中?
  • 該屬性不會被序列化爲新的XML文件?

我問的原因是我用一個更新的選項替換了文件中的一個屬性。舊屬性是一個簡單的布爾屬性,新屬性是一個枚舉。根據舊屬性在添加新屬性之前的意思,我已經更改舊屬性,以便將新屬性的值轉換爲布爾值,get和set都已實現。

這使我可以通過閱讀舊屬性(設置新屬性)和序列化後添加新屬性來靜默升級新文件。

但是,我想從新的xml文件中刪除舊的屬性,所以我想知道如果我用[XmlIgnore]標記它會發生什麼,舊的xml文件是否仍然正確反序列化並從該文件讀取該屬性,或者它會被完全忽略嗎?

如果不是,下面的改變會做我想要的嗎?

[XmlAttribute("is-list")] 
[DefaultValue(false)] 
public bool IsList 
{ 
    get { return false; } 
    set { 
     if (value) 
      ListHandling = ListHandling.All; 
    } 
} 

這將返回所有新對象,因爲我已經指定了默認值,它會被忽略假的,如果出現在一箇舊文件,並設置爲true,將改變ListHandling屬性,它是新的重要。

編輯:經過測試,我已驗證兩種方法似乎都是按照我想要的方式進行的。儘管如此,我仍然會留下問題,因爲我仍然想知道上面提到的第一個行爲是否僅僅是實現細節,或者是否可以這樣理解文檔。

回答

2

如果您將一個屬性標記爲XmlIgnore,那麼將被忽略。當XmlSerializer構建它的序列化程序集時,不會考慮它。因此,在反序列化期間不會填充XmlIgnore-d屬性,並且將保留它們的默認值。

示例程序(摘錄編譯):

public static void RunSnippet() 
{ 
    XmlSerializer ser = new XmlSerializer(typeof(Fie)); 
    Fie f = (Fie)(ser.Deserialize(new StringReader("<Fie><Bob>Hello</Bob></Fie>"))); 
    WL(f.Bob == null ? "null" : "something"); 
} 

public class Fie 
{ 
    [XmlIgnore] 
    public string Bob { get; set; } 
} 

從這個程序的輸出是null(如果你從Fie.Bob刪除XmlIgnore輸出something)。

編輯回覆您的編輯:這不只是一個實施細節;它確實是屬性的記錄行爲。從the docs的備註部分(第一段):「如果將XmlIgnoreAttribute應用於類的任何成員,則在序列化或反序列化類的實例時,XmlSerializer會忽略該成員。」 (強調增加)

+0

好的,謝謝,那麼我想我的測試顯示它做了什麼是愚蠢的運氣。猜測我的第二個實現是我想要使用的那個。 – 2010-02-28 08:36:33

+0

如果將[XmlIgnore]置於子類/覆蓋屬性上,則該屬性將被忽略,並且該值將被序列化並反序列化。 – Sven 2016-10-25 13:25:50

相關問題