2010-02-02 16 views
9

我有這個類:有沒有辦法避免XmlSerializer反序列化時不初始化一個null屬性?

public class MySerializableClass 
{ 
    public List<MyObject> MyList { get; set; } 
} 

如果MYLIST爲空時MySerializableClass序列化,我需要把它空時,它的deserialised過,但是當它deserialises我的類XmlSerializer的總是初始化。

有沒有辦法避免它初始化null屬性?

當它爲空時,MyList甚至不會被記錄在序列化文件中。當我用空值加載並再次保存它時,MyList不再爲空,它被序列化爲列表<>,其中有0項,但不爲空。

謝謝。

更多信息:

的IsDeserializing財產是不可行的,由於在課堂上

+0

哇,從來沒有的System.Xml抓住我的驚喜。擁有一個集合類成員的公共setter是非常不尋常的,審查你的設計來驗證這是你真正想要的。它沒有一個setter可以工作。 – 2010-02-03 00:40:51

+2

這不是我真正想要的。這是串行器想要的。如果我使get或set爲private,則解串器將失敗。 – Carlo 2010-02-04 20:55:18

回答

8

這看起來像一個bug結構的一些代碼的限制...

即使嘗試標記該財產爲可空,它似乎並沒有工作。

[XmlArray(IsNullable = true)] 
public List<MyObject> MyList { get; set; } 

它系列化MYLIST屬性,如下所示:

<MyList xsi:nil="true" /> 

所以XML清楚地表明,該列表是空的,但反序列化後,它仍然是初始化爲空列表...

如果更換List<MyObject>MyObject[],它工作正常(即使沒有IsNullable = true),但它可能不是你想要的...

您應該可以在Connect上報告。

+1

報告錯誤後,編輯您的問題以包含錯誤報告的URL。這將允許其他人投票處理該錯誤。 – 2010-02-03 00:27:50

+1

請投票並在這裏添加一些評論https://connect.microsoft。com/VisualStudio/feedback/details/687096/xmlserializer-initializes-a-list-when-it-should-not – 2011-09-07 01:26:44

0

如果您需要空值,請勿使用自動實施的屬性。 使用例如

public class MySerializableClass 
{ 
    List<MyObject> myList 
    public List<MyObject> MyList { get {return myList;} set {myList = value;} } 
} 
+1

不解決問題,請嘗試。 – 2010-02-03 00:38:09

+0

是的,我其實是這樣的,我簡化了它的例子,但謝謝你的建議。 – Carlo 2010-02-03 04:04:27

0

我有同樣的問題,但是添加XmlArrayAttribute與沒有設置該屬性使得它成爲我

public class MySerializableClass 
{ 
    [XmlArray] 
    public List<MyObject> MyList { get; set; } 
} 
+0

不適合我! – 2018-01-02 11:09:31

0

如果名爲添加屬性的工作*屬性名*指定爲布爾值僅當XmlSerializer爲true時纔會爲列表呈現標記。

例子:

public class MySerializableClass 
{ 
    public List<MyObject> MyList { get; set; } 

    [XmlIgnore] 
    public bool MyListSpecified { get; set; } 
} 
+0

不起作用,試用於4.0 – annakata 2014-09-22 09:49:29

相關問題