我使用序列化/去序列化技术。 BinaryFormatter类。 每次创建新程序集时,即使类结构相同,BinaryFormatter也不能反序列化二进制数据,但程序集版本不同。 如果类结构保持不变,是否可以反序列化二进制缓冲区而不检查程序集版本?
答案 0 :(得分:7)
试试这个:
public sealed class CurrentAssemblyDeserializationBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
return Type.GetType(String.Format("{0}, {1}", typeName, Assembly.GetExecutingAssembly().FullName));
}
}
formatter.Binder = new CurrentAssemblyDeserializationBinder();
formatter.Deserialize(inStream);
线程海报已添加:
是的,它有效。只要确保二进制数据中是否存在任何类型的System.Generic或其他Lib,那么您必须通过它们而不进行更改。 “ResizableControls” - 旧的程序集lib'名称,“EntityLib” - 新的程序集名称。 此外,版本号也将根据需要进行替换。
public sealed class CurrentAssemblyDeserializationBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
string name;
if (assemblyName.Contains("ResizableControl"))
{
name = Assembly.GetAssembly(typeof(EntityLib.Pattern)).ToString();
}
else
{
name = assemblyName;
}
return Type.GetType(String.Format("{0}, {1}",
typeName.Replace("ResizableControl", "EntityLib"), name));
}
}
谢谢,这正是我所需要的。
答案 1 :(得分:6)
这是BinaryFormatter
所固有的。 你可以做些高级的事情来解决它(使用代理等),但这并不容易,我老实说不推荐它。
我强烈建议您查看基于合同的序列化程序;例如:
XmlSerializer
DataContractSerializer
(但不 NetDataContractSerializer
)(我偏向最后,因为它提供了更高效的输出,故意避免了一些更多的版本问题)
在所有这些情况下,数据存储不会(至少使用默认设置)包含任何类型的知识,除了名称所暗示的合同或指定的(通常)在属性)。
答案 2 :(得分:1)
我认为这是BinaryFormatter的一个已知问题 - here是一种可能的解决方案 你可以控制使用SerializationBinder加载哪种类型 - 链接提供代码以及如何使用它的示例(几乎在所有.net语言中)