2012-06-12 201 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的缩写。 :) –