【发布时间】:2012-09-05 07:02:51
【问题描述】:
我很想知道如何使用带有 FormatterAssemblyStyle.Full 的二进制格式化程序的汇编格式来“打破”反序列化。
documentation 对此表示:
在完整模式下,反序列化过程中使用的程序集必须匹配 正是序列化期间使用的程序集。
我想如果我用 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 生成的序列化文件都包含完整的版本信息(例如版本 1.0.0.0 Culture = 中性,PublicKeyToken = null) - 我认为 Simple 不会添加所有这条信息? (请参阅this 中的格式化程序和程序集名称部分)
更新 1:
到目前为止,我看到的唯一区别是,如果我使用 Simple,那么我不必必须将 OptionalField 属性放置到序列化类中的新字段中,以便它去 -成功序列化旧版本。如果我使用 Full,那么它会抛出异常,除非我将 OptionalField 属性放在新字段上。如果使用非强名称的程序集,这是唯一的区别吗??
详情请见this。
提前致谢
【问题讨论】:
标签: c# .net winforms visual-studio-2010 serialization