属性有什么问题?据我所知,当我反序列化缺少此新成员的类的旧版本时,我必须使用[OptionalField]属性在我的类的较新版本中装饰一个新成员。但是,在序列化类之后添加InnerTranslator属性时,下面的代码不会抛出异常。我正在检查onDeserialization方法中的属性是否为null(它确认它没有被序列化),但我本以为代码会抛出异常。[OptionalField]属性本身是可选的吗?},{"西班牙","西班牙"}};vartranslator=newCountryTranslator(listcol);使用(varfile_stream=newFileStream("translator.bin",FileMode.Open)){varformatter=newBinaryFormatter();translator=formatter.Deserialize(file_stream)asCountryTranslator;file_stream.Close();}控制台.ReadLine();}}[可序列化]内部类CountryTranslator:IDeserializationCallback{publicintCount{get;放;}publicCountryTranslator(SortedListsorted_list){this.country_list=sorted_list;inner_translator=newList{"one","two"};}//[OptionalField]privateListinner_translator;publicListInnerTranslator{get{returninner_translator;}set{inner_translator=value;}}privateSortedListcountry_list;publicvoidOnDeserialization(objectsender){Debug.Assert(inner_translat或==空);Count=country_list.Count;如果你改变东西,BinaryFormatter最好非常脆弱。特别是,自动实现的属性、混淆、重命名、强命名等方面存在巨大问题。我记得,关于[OptionalField]的一些规则在发布前发生了变化;版本容忍的东西并没有像我预期的那样容易工作。我的建议:如果你想要版本容忍序列化(即你今天可以序列化它并使用你的应用程序的下一个版本反序列化它),那么不要使用BinaryFormatter;它(IMO)仅在同一版本(Remoting、AppDomain等)之间可用以传递数据。对于版本之间的工作,我推荐基于契约的序列化;像XmlSerializer和DataContractSerializer(.NET3.0),或binary-protobuf-net或类似的。所有这些在版本容错性方面都好得多(实际上,您甚至不需要将其反序列化为相同的类型);此外,它们跨平台工作-因此您可以在.NET中序列化并在java/C++/等中使用反序列化。以上就是C#学习教程:属性有什么问题?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
