我有一个现有的代码库,它通过 将几个简单的类保存到磁盘NetDataContractSerializer
,但不幸的是,这些类不是用 装饰的[DataContract]
,而是用[Serializable]
. 这工作正常,但现在我想向持久类添加一些新属性,同时仍然能够读取旧版本生成的文件。
假设这是一个类:
[Serializable]
public class Persisted
{
public int OldProperty {get;set;}
public int NewProperty {get;set;}
}
现在,当我反序列化旧文件时,我得到一个异常,因为它们不包含NewProperty
. 这是有道理的。所以我想NewProperty
忽略,但是虽然有一个[OptionalField]
属性可以让序列化程序忽略丢失的字段,但它不能应用于属性 - 只有字段。
所以我想我会使用[DataContract]
and [DataMember]
,它也有一个IsRequired
属性,但这会改变序列化文件的布局,并且它无法读取旧的数据文件。此外,您不能混合[Serializable]
-[DataMember]
如果序列化程序看到该[Serializable]
属性,它会忽略[DataMember]
指令。
那么,除非选择对旧文件进行一次性转换(可能,但不是我的第一选择),有没有办法让 NetDataContractSerializer 忽略现有 XML 序列化对象中的字段?