【问题标题】:Optional properties when deserializing a DataContract/Serializable mish-mash反序列化 DataContract/Serializable 混搭时的可选属性
【发布时间】:2012-04-09 20:17:32
【问题描述】:

我有一个现有的代码库,它通过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 序列化对象中的字段?

【问题讨论】:

    标签: c# serialization netdatacontractserializer


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-21
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多