据我所知,当我反序列化缺少这个新成员的我的类的旧版本时,我必须使用[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; …Run Code Online (Sandbox Code Playgroud) 我很想知道如何使用FormatterAssemblyStyle.Full的二进制格式化程序的汇编格式来"中断"反序列化.
该文件对这一规定:
在完整模式下,反序列化期间使用的程序集必须与序列化期间使用的程序集完全匹配.
我认为,如果我序列化一个对象(_person是一个带有值类型字段的简单类)与版本1.0.0.0的程序集,然后尝试用程序集的v1.2.0.0(更新AssemblyInfo.cs)反序列化,我会得到一个反序列化异常.但是,它成功地反序列化.
我错过了什么吗?
我正在使用以下序列化文件:
BinaryFormatter formatter = new BinaryFormatter();
formatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full;
using (Stream stream = new FileStream(fileName,
FileMode.Create,
FileAccess.Write,
FileShare.None))
{
formatter.Serialize(stream, _person);
stream.Close();
}
Run Code Online (Sandbox Code Playgroud)
然后使用以下代码反序列化:
BinaryFormatter formatter = new BinaryFormatter();
formatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full;
using (Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
_person = (Person)formatter.Deserialize(stream);
stream.Close();
}
Run Code Online (Sandbox Code Playgroud)
我还注意到使用FormatterAssemblyStyle.Full和FormatterAssemblyStyle.Simple生成的序列化文件都包含完整的版本信息(例如Version 1.0.0.0 Culture = neutral,PublicKeyToken = null) - 我认为Simple不会添加所有这些信息?(请参阅从格式化和组装名节本)
更新1:
到目前为止我唯一看到的区别是,如果我使用Simple,那么我不必将OptionalField属性放在序列化类中的新字段中,以便成功地对旧版本进行反序列化.如果我使用Full,那么它会抛出异常,除非我将OptionalField属性放在新字段上.这是唯一的区别,如果使用不强大的程序集??
请参阅此了解详情.
提前致谢