gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:31:32 24 4
gpt4 key购买 nike

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

假设这是类:

[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 序列化对象中的字段?

最佳答案

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

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

关于c# - 反序列化 DataContract/Serializable mish-mash 时的可选属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9870244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com