【问题标题】:Deserialize object into assembly that is now signed and versioned将对象反序列化为现在已签名和版本控制的程序集
【发布时间】:2009-04-23 08:02:22
【问题描述】:

我曾经使用 BinaryFormatter (c#) 序列化树视图。执行此操作并包含所有可序列化类的程序集现在具有一个强名称并已签名,并且还获得了一个新版本号(但是,实现没有改变)。

当我尝试反序列化 byte[] 数组时,行

(TreeViewData)binaryFormatter.Deserialize(memoryStream);

产生 ArgumentNullException。 (参数名称:类型)

我认为版本号是问题,所以我实现了一个自己的Binder。我重写了 BindToType 方法,并确保版本已更正并返回正确的类型。

但是,在程序离开 BindToType 方法的那一刻,我仍然得到上面提到的异常。

我该如何解决这个问题?

【问题讨论】:

    标签: .net serialization strongname


    【解决方案1】:

    您可以使用SerializationBinder 来解决此问题:

    private class WeakToStrongNameUpgradeBinder : SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            try 
            {
                //Get the name of the assembly, ignoring versions and public keys.
                string shortAssemblyName = assemblyName.Split(',')[0];
                var assembly = Assembly.Load(shortAssemblyName);
                var type = assembly.GetType(typeName);
                return type;
            }
            catch (Exception)
            {
                //Revert to default binding behaviour.
                return null;
            }
        }
    }
    

    然后

    var formatter = new BinaryFormatter();
    formatter.Binder = new WeakToStrongNameUpgradeBinder();
    

    瞧,您的旧序列化对象可以使用此格式化程序反序列化。如果类型也发生了变化,您可以使用 SerializationSurrogate 将旧类型反序列化为新类型。

    正如其他人所提到的,自己进行序列化而不是依赖 IFormatter 是一个好主意,因为您可以更好地控制版本控制和序列化大小。

    【讨论】:

      【解决方案2】:

      您可以尝试使用序列化代理,但如果没有我们可以重现的东西,就很难给出一个体面的答案。

      然而,根本问题是 BinaryFormatter 在涉及程序集之类的东西时非常非常脆弱。哎呀,即使within an assembly,它也足够脆弱。

      听起来TreeViewData 是基于树的,所以我想知道 xml 是否会是一个更好的(即更多的版本容忍)选项。如果效率是一个问题,有自定义二进制格式(如protobuf-net)提供高性能、版本容错、可移植二进制序列化。如果您的数据已经序列化...我想知道是否是时候改变轨道了?尝试使用旧程序集反序列化数据,并切换到更强大的序列化策略。

      【讨论】:

        【解决方案3】:

        我的建议是永远不要将内置序列化用于持久存储。如果将来某天出于其他原因您需要从另一种语言读取和写入文件格式,请始终编写自己的代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-15
          • 2010-10-05
          • 2020-02-24
          • 2011-03-12
          • 1970-01-01
          • 1970-01-01
          • 2013-11-12
          • 1970-01-01
          相关资源
          最近更新 更多