2012-06-12 61 views
0

是否有序列化datacontracts列表?我已經創建了列表中datacontract,是這樣的:序列化/反序列化DataContracts列表

[DataContract] 
class ItemList<T> 
{ 
    public ItemList() 
    { 
     items=new List<T>(); 
    } 

    [DataMember] 
    public List<T> items;  
} 

我有3個clases配置,Config_V1,Config_V2與屬性[名稱=「配置」]是什麼讓我用3個版本的之間的版本配置類。所以我想在這個Config類的ItemList之間進行序列化和反序列化。我曾嘗試類似:

ItemList<ConfigData_V1> l = new ItemList<ConfigData_V1>(); 
l.items.Add(config); 
WriteObject<ItemList<ConfigData_V1>>("serialization.bin", l); 
ItemList<ConfigData_V2> l2; 
l2=ReadObject<ItemList<ConfigData_V2>>("serialization.bin"); 

但與說,它期待ConfigData_V2的列表,但它發現ConfigData_V1的列表ReadObj反序列化時,我得到一個錯誤。難道它只是使用ConfigData clas版本來解決這個衝突嗎?

+0

我認爲這是序列化這個強類型的'List '本身(不是它的成員)就是這個問題。儘可能地嘗試一種無類型的List。 – bluevector

+0

@jonnyGold你是不對的。列表是可串行化的(IEnumereble 不)。問題在其他地方。 – RredCat

+0

@RrefCat我沒有說它不是可序列化的。我說這是事實,一個'List '被串行化,並且他試圖將它反序列化爲'List '。它們不一樣,所以它不起作用。他必須做到無類型化。 – bluevector

回答

2

當您反序列化一個對象(List<Contract1>)時,它會添加元數據以指定 - 數據是List的一部分,b - 包含對象是Contract1

如果你看看寫入的實際XML,你會在節點中看到這個。

因此,當您嘗試讀取List<Contract2>時,由於您告訴它包含的數據是Contract1,但您試圖讀取Contract2,所以您打破了模型的定義。

有一個屬性[KnownType(Type)]這有可能幫助你,如果你指出Contract2是Contract1已知類型雖然真的撕毀合同的整個概念......

+0

是的,你是對的,它打破了合同的概念。你知道另一種方法來做到這一點嗎? – Notbad

+1

取決於你正在嘗試做什麼。我想不出一個正常的情況,你會序列化數據然後反序列化成一個新的合同版本。除非 - ooohhh - 數據保存在一個版本中,然後在不保存序列化數據的情況下更新應用程序。亂。很亂。如果是這樣的話,我會寫一個Q&D,將Contract1反序列化,然後序列化Contract2。 –

+0

哎呀....對不起。 Q&D是Quick And Dirty的縮寫。 :) –