gpt4 book ai didi

c# - [OptionalField] 属性有什么用?

转载 作者:太空狗 更新时间:2023-10-29 18:33:41 25 4
gpt4 key购买 nike

据我所知,当我反序列化缺少新成员的类的旧版本时,我必须使用 [OptionalField] 属性装饰类的新版本中的新成员。

但是,在序列化类之后添加了 InnerTranslator 属性时,下面的代码没有抛出异常。我在 onDeserialization 方法中检查该属性是否为 null(确认它未序列化),但我预计代码会因此抛出异常。[OptionalField] 属性本身是可选的吗?

class Program
{
static void Main(string[] args)
{
var listcol = new SortedList<string,string>
{
{"Estados Unidos", "United States"},
{"Canadá", "Canada"},
{"España", "Spain"}
};
var translator = new CountryTranslator(listcol);
using (var file_stream=new FileStream("translator.bin",FileMode.Open))
{
var formatter = new BinaryFormatter();
translator = formatter.Deserialize(file_stream) as CountryTranslator;
file_stream.Close();
}
Console.ReadLine();
}
}

[Serializable]
internal class CountryTranslator:IDeserializationCallback
{
public int Count { get; set; }

public CountryTranslator(SortedList<string,string> sorted_list)
{
this.country_list = sorted_list;
inner_translator = new List<string> {"one", "two"};
}
//[OptionalField]
private List<string> inner_translator;
public List<string> InnerTranslator
{
get { return inner_translator; }
set { inner_translator = value; }
}

private SortedList<string, string> country_list;

public void OnDeserialization(object sender)
{
Debug.Assert(inner_translator == null);
Count=country_list.Count;
}
}

最佳答案

BinaryFormatter最好 的时候,如果您更改内容,它会非常脆弱。尤其重要的是,automatically implemented properties, obfuscaction 存在巨大问题、重命名、强命名等

我记得,关于 [OptionalField] 的一些规则在发布之前发生了变化;我预计,版本容错的事情并没有像计划的那样容易解决。

我的建议:如果你想要版本容忍序列化(即你可以今天序列化它并使用你的应用程序的下一个版本反序列化它),那么不要使用 BinaryFormatter;这是(IMO)仅适用于在相同版本(远程处理、AppDomain等)之间传递数据。

对于版本之间的工作,我推荐基于契约的序列化; XmlSerializerDataContractSerializer (.NET 3.0) 之类的东西,或者对于二进制 - protobuf-net或类似工具。所有这些在版本容错方面都好得多(实际上,您甚至不需要将其反序列化为相同的类型);此外,它们可以在平台之间使用——因此您可以在 .NET 中序列化并在 java/C++/等中反序列化。

关于c# - [OptionalField] 属性有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/929985/

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