.NET中的程序集独立序列化

我使用序列化/去序列化技术。 BinaryFormatter类。 每次创建新程序集时,即使类结构相同,BinaryFormatter也不能反序列化二进制数据,但程序集版本不同。 如果类结构保持不变,是否可以反序列化二进制缓冲区而不检查程序集版本?

试试这个:

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)); } } 

谢谢,这正是我所需要的。

这是BinaryFormatter所固有的。 你可以做一些先进的事情来解决它( 代理人等),但这并不容易,老实说我不推荐它。

强烈建议你看一下基于合同的序列化器; 例如:

  • XmlSerializer
  • DataContractSerializer (但不是 NetDataContractSerializer
  • protobuf网

(我偏向最后,因为它提供了更高效的输出,故意避免一些更多的版本问题)

在所有这些情况下,数据存储不(至少使用默认设置)包括任何类型的知识,除了名称所暗示的合同或指定的(通常在属性中)。

我认为这是BinaryFormatter的一个已知问题 – 这是一个可能的解决方案,您可以控制使用SerializationBinder加载哪种类型 – 链接提供代码和一个示例如何使用它(在几乎所有的.net语言中)