反序列化DataContract / Serializable mish-mash时的可选属性

时间:2012-03-26 10:09:39

标签: c# serialization netdatacontractserializer

我有一个现有的代码库,可以通过NetDataContractSerializer将几个简单的类保存到磁盘,但遗憾的是,这些类没有用[DataContract]装饰,而是用[Serializable]装饰。这工作正常,但现在我想为持久化类添加一些新属性,同时仍然能够读取旧版本生成的文件。

让我们说这是班级:

[Serializable]
public class Persisted
{
    public int OldProperty {get;set;}
    public int NewProperty {get;set;}
}

现在,当我反序列化旧文件时,我得到一个例外,因为它们不包含NewProperty。这是有道理的。所以我想忽略NewProperty,但是虽然有一个[OptionalField]属性让序列化程序忽略缺少的字段,但它不能应用于属性 - 仅字段。

所以我想我会使用[DataContract][DataMember],它也有IsRequired属性,但是这会改变序列化文件的布局,而且它无法读取旧数据文件。此外,您无法混合[Serializable][DataMember] - 如果序列化程序看到[Serializable]属性,则会忽略[DataMember]指令。

因此,除非选择对旧文件进行一次性转换(可能,但不是我的第一选择),有没有办法让NetDataContractSerializer忽略现有XML序列化对象中的字段?

1 个答案:

答案 0 :(得分:4)

问题是,在使用Serializable属性时,序列化的是字段,而不是属性。由于您使用的是自动属性,因此这些字段是隐藏的,您无法为它们添加属性。

解决方案很简单 - 不要使用自动属性。