二进制序列化命名空间更改

时间:2011-03-01 09:27:39

标签: .net deserialization binary-deserialization

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

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

3 个答案:

答案 0 :(得分:4)

你可以强制新的Type在你自己的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中设置绑定器

var formatter = new BinaryFormatter();

formatter.Binder = new MyBinder(typeof(YourClass));

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

答案 1 :(得分:2)

最容易处理的是AppDomain.TypeResolve事件。

答案 2 :(得分:2)

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

此外,您可以SerializationBinder使用BinaryFormatter。在.NET 4.0中,您可以在BindToName中提供SerializationBinder方法,以便在序列化时控制自定义类型名称映射。