2010-08-24 19 views
4

我正在使用XMLSerializer來序列化我自己的一個類的列表。該類的其中一個屬性是一個沒有無參數構造函數的密封類的實例,因此XML序列化程序拒絕序列化該類。我怎樣才能解決這個問題?我需要該屬性被序列化。XML如何使用無參數構造函數序列化密封類?

有什麼方法可以讓我指定該類應該如何序列化?

我們希望繼續使用XML;是否有另一個我可以使用的XML序列化程序不會有這個問題?

再一次,我很抱歉如果這是一個騙局,但我不知道要搜索什麼。

[編輯]澄清,我沒有訪問密封類的來源。

回答

11

不可能直接做; XmlSerializer無法應付沒有無參數構造函數的類。

我通常做的是將無參數類包裝在另一個與XML兼容的類中。包裝類有一個無參數構造函數和一組讀寫屬性;它有一個調用真實類的構造函數的方法FromXml

[XmlIgnore] 
public SomeClass SomeProperty { get; set; } 

[XmlElement("SomeProperty")] 
public XmlSomeClass XmlSomeProperty 
{ 
    get { return XmlSomeClass.ToXml(SomeProperty); } 
    set { SomeProperty = value.FromXml(); } 
} 
+0

這是一個非常酷的方式來做到這一點,謝謝! – NickAldwin 2010-08-24 18:33:24

+0

簡單而優雅。 – 2010-08-24 18:35:28

0

你可以製作一個私人的無參數構造函數嗎?假設你有權訪問該類的代碼,這將工作。

+0

不幸的是,我無法訪問源代碼。它是SDK的一部分。 – NickAldwin 2010-08-24 18:32:02

+0

'XmlSerializer'不會看私人成員 – 2010-08-24 18:32:32

+0

在這種情況下,我會嘗試Tim Robinson的想法。這將是我的下一個建議:) – 2010-08-24 18:32:55

0

您可以在含有類實現ISerializable,然後實現自定義序列。

+0

'ISerializable'用於'BinaryFormatter'。而且即使'IXmlSerializable'也需要ctor。 – 2010-08-24 18:36:55

+0

啊。不知道二進制格式。難道你不能使用自定義序列化器和反序列化器實現來包含密封對象的屬性設置嗎? – 2010-08-24 18:42:54

+0

不與XmlSerializer,沒有。除非你從頭開始寫。 – 2010-08-24 21:25:58

0

根據xml的複雜程度,您可能可能DataContractSerializer有一些運氣。這不提供任何相同級別的xml控件,但它完全繞過構造函數。並適用於私人類型。

我也許會問:它實際上是否需要xml?還有其他序列化程序,如json或protobuf等,沒有XmlSerializer限制。

0

使用IXmlSerializable,XmlSerializer太有限。

+0

'IXmlSerializable'也需要一個無參數的構造函數。 – trapicki 2015-04-22 13:30:24

相關問題