序列化/反序列化数据协定列表

本文关键字:列表 数据 反序列化 序列化 | 更新日期: 2023-09-27 18:37:06

无论如何可以序列化数据合约列表吗?我已经为列表创建了一个数据合约,如下所示:

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

我有 3 个类别 配置、Config_V1 Config_V2属性 [Name="Config"] 让我在 Config 类的 3 个版本之间使用版本控制。所以我想在这个配置分支的 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");

但是在使用 ReadObj 反序列化时出现错误,说它期待一个ConfigData_V2列表,但它找到了ConfigData_V1列表。难道它不会只使用 ConfigData clases 的版本控制来解决此冲突吗?

序列化/反序列化数据协定列表

当你反序列化一个对象(List<Contract1>)时,它会添加元数据以指定a-数据是List的一部分,b-包含的对象是Contract1

如果您查看编写的实际 XML,您将在节点中看到这一点。

因此,当您尝试读取List<Contract2>时,您会破坏模型的定义,因为您告诉它包含的数据是Contract1,但您试图读取Contract2

如果您声明 Contract2 是一种已知的Contract1类型,[KnownType(Type)]有一个属性可能会对您有所帮助,尽管这确实破坏了合同的整个概念......