2008-11-19 105 views
1

我有一個自定義實體對象的集合,其中一個屬性是字節數組的一個ArrayList如何反序列化具有子集合的集合?

自定義實體是可序列化和收藏屬性被標記爲具有以下屬性:[XmlArray("Images"), XmlArrayItem("Image",typeof(byte[]))]

所以我序列化這些自定義實體的集合,並將它們傳遞到Web服務,作爲一個字符串。

Web服務接收機智的字符串和字節數組,

下面的代碼然後嘗試反序列化集合 - 回用於處理自定義實體...

XmlSerializer ser = new XmlSerializer(typeof(List<myCustomEntity>)); 
StringReader reader = new StringReader(xmlStringPassedToWS); 
List<myCustomEntity> entities = (List<myCustomEntity>)ser.Deserialize(reader); 

foreach (myCustomEntity e in entities) 
{ 
    // ...do some stuff... 

    foreach (myChildCollection c in entities.ChildCollection 
    { 
     // .. do some more stuff.... 
    } 
} 

我檢查由初始序列化產生的XML,它包含字節數組 - 子集合,就像上面構建的StringReader一樣。

反序列化過程之後,自定義實體的結果集合就沒有問題,只是集合中的每個對象都沒有在其子集合中包含任何項目。 (即它不會達到「...做更多的東西...」

有人可以請解釋我做錯了什麼?是否有可能在自定義實體的通用集合中序列化ArrayLists?

回答

0

要序列化的可序列化類的屬性必須是讀/寫。

在我上面的例子中,ArrayList屬性是隻讀的,它是基於一個單獨的函數返回字節數組,其中文件名被添加到它。

一旦爲ArrayList屬性編寫了一個setter,並且在整個Add方法中調整了一下邏輯,序列化就可以工作。

課程:對於需要基於序列化流重構的可序列化類,所有序列化的屬性都需要可寫 - 當你說出這些時,有點顯而易見。

2

這依賴於你在做什麼,有多種選項...調查在System.Xml.Serialization命名空間中的XML屬性...特別是,檢查出

[XmlArrayItem(的ElementName =「 「)]

這是作爲一種類型的集合類型的屬性(我認爲它需要實現ILis t),並將由XmlDeserializer用名爲「ElementName」的Xml元素填充...

有一大堆Xml屬性可以用來精確控制序列化和反序列化的發生。您可以通過使用正確的Xml進行適當的修飾來創建您想要的任何類結構*屬性

+0

我確實有XmlArrayItem標籤 - 我在想如果字節數組的「ArrayList」是問題。 – 2008-11-19 02:07:27

+0

謝謝你在那裏的努力。問題不在於我的序列化到底如何,使得這個問題「有點」難以回答,而是與財產本身有關。對不起,再次感謝您的努力。 – 2008-11-19 04:48:03