Avn*_*tan 8 c# serialization netdatacontractserializer
我有一个现有的代码库,它将几个简单的类保存到磁盘上NetDataContractSerializer
,但遗憾的是,这些类没有用[DataContract]
,而是用[Serializable]
.这工作正常,但现在我想为持久化类添加一些新属性,同时仍然能够读取旧版本生成的文件.
让我们说这是班级:
[Serializable]
public class Persisted
{
public int OldProperty {get;set;}
public int NewProperty {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我反序列化旧文件时,我得到一个异常,因为它们不包含NewProperty
.这是有道理的.所以我想NewProperty
忽略,但是虽然有一个[OptionalField]
属性让序列化程序忽略缺少的字段,但它不能应用于属性 - 仅字段.
所以我想我会使用[DataContract]
和[DataMember]
,它也有一个IsRequired
属性,但这会改变序列化文件的布局,而且它无法读取旧的数据文件.此外,你不能混用[Serializable]
和[DataMember]
-如果串行看到[Serializable]
属性,它忽略了[DataMember]
指令.
因此,除非选择对旧文件进行一次性转换(可能,但不是我的第一选择),有没有办法让NetDataContractSerializer忽略现有XML序列化对象中的字段?
问题在于,使用Serializable
属性时,序列化的是字段而不是属性。由于您使用的是自动属性,因此字段是隐藏的,因此您无法向其中添加属性。
解决方案很简单-不要使用自动属性。