. net中独立于程序集的序列化

本文关键字:序列化 程序集 独立 net | 更新日期: 2023-09-27 18:06:18

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

. net中独立于程序集的序列化

试试这个:

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

线程海报添加:

是的,它有效。只要确保有任何类型的系统。二进制数据中存在通用或其他lib,那么您必须在不进行更改的情况下传递它们。"ResizableControls" -旧程序集库名称,"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-net

(我倾向于最后一个,因为它提供了更有效的输出,并且故意避免了一些更多的版本问题)

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

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