【问题标题】:Binary Serialization Namespace Change二进制序列化命名空间更改
【发布时间】:2011-03-01 09:27:39
【问题描述】:

我已经序列化了一个曾经位于命名空间 Temp 中的类,但现在我在另一个命名空间中反序列化(我的意思是我用来获取对象的类当前驻留在另一个命名空间中)。我面临找不到 Temp 命名空间的错误。我发现这个映射很有用: Maintain .NET Serialized data compatability when moving classes.

有没有办法只序列化类对象而不是程序集信息或命名空间信息? (我正在考虑未来的变化并摆脱这种映射)。

【问题讨论】:

    标签: .net deserialization binary-deserialization


    【解决方案1】:

    您可以强制新类型在您自己的 Binder 中重写方法。 (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder.aspx)

    例如,您可以定义以下类:

    sealed class MyBinder : SerializationBinder
    {
        private readonly Type _type;
    
        public MyBinder(Type type)
        {
            _type = type;
        }
    
        public override Type BindToType(string assemblyName, string typeName)
        {
            return _type;
        }
    }
    

    然后在 BinaryFormatter 中设置 binder

    var formatter = new BinaryFormatter();
    
    formatter.Binder = new MyBinder(typeof(YourClass));
    
    using (var stream = new MemoryStream(bytes))
    {
        YourClass yourobject = formatter.Deserialize(stream);
    }
    

    【讨论】:

      【解决方案2】:

      最简单的处理方法是使用AppDomain.TypeResolve 事件。

      【讨论】:

      • @rene: 忽略了那部分 :) 不知道他能不能做点什么,只是让旧数据冒出来……
      • 我不依赖任何特定数据,但我想确保这些数据是否要在其他命名空间中反序列化,它会在没有任何上述类型的映射的情况下这样做。
      【解决方案3】:

      创建BinaryFormatter 来序列化数据时,可以将AssemblyFormat 属性设置为FormatterAssemblyStyle.Simple。这将导致仅序列化程序集名称,而不是整个版本限定的完整程序集名称。

      您还可以将SerializationBinderBinaryFormatter 一起使用。在 .NET 4.0 中,您可以提供 BindToName 方法作为 SerializationBinder 的一部分,它允许您在序列化时控制自定义类型名称映射。

      【讨论】:

        猜你喜欢
        • 2013-06-14
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多