我很好奇如何使用FormatterAssemblyStyle.Full格式的二进制格式化程序中的程序集格式“破坏”反序列化。
文档说明如下:
在完整模式下,反序列化期间使用的程序集必须与序列化期间使用的程序集完全匹配。
我认为,如果我使用程序集的版本1.0.0.0对对象(_person是一个带有值类型字段的简单类)进行序列化,然后尝试使用程序集v1.2.0.0(更新AssemblyInfo.cs)进行反序列化,那么我会收到反序列化异常。但是,它成功地进行了反序列化。
我是否漏掉了什么?
我正在使用以下方式将其序列化到文件中:
然后使用以下方式反序列化:
我还注意到使用 FormatterAssemblyStyle.Full 和 FormatterAssemblyStyle.Simple 生成的序列化文件都包含完整的版本信息(例如 Version 1.0.0.0 Culture = neutral,PublicKeyToken = null)- 我原以为 Simple 不会添加所有这些信息? (请参见此处中的格式化程序和程序集名称部分)。
更新1:
到目前为止,我看到唯一的区别是,如果我使用 Simple,则不必为序列化类中的新字段放置 OptionalField 属性,它就可以成功反序列化旧版本。如果使用 Full 则会抛出异常,除非我在新字段上放置 OptionalField 属性。如果使用没有强名称的程序集,这是唯一的区别吗?
有关详细信息,请参见此处。
提前致谢。
文档说明如下:
在完整模式下,反序列化期间使用的程序集必须与序列化期间使用的程序集完全匹配。
我认为,如果我使用程序集的版本1.0.0.0对对象(_person是一个带有值类型字段的简单类)进行序列化,然后尝试使用程序集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();
}
然后使用以下方式反序列化:
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();
}
我还注意到使用 FormatterAssemblyStyle.Full 和 FormatterAssemblyStyle.Simple 生成的序列化文件都包含完整的版本信息(例如 Version 1.0.0.0 Culture = neutral,PublicKeyToken = null)- 我原以为 Simple 不会添加所有这些信息? (请参见此处中的格式化程序和程序集名称部分)。
更新1:
到目前为止,我看到唯一的区别是,如果我使用 Simple,则不必为序列化类中的新字段放置 OptionalField 属性,它就可以成功反序列化旧版本。如果使用 Full 则会抛出异常,除非我在新字段上放置 OptionalField 属性。如果使用没有强名称的程序集,这是唯一的区别吗?
有关详细信息,请参见此处。
提前致谢。