3

我已经序列化了一个曾经位于命名空间 Temp 中的类,但现在我在另一个命名空间中反序列化(我的意思是我用来获取对象的类当前驻留在另一个命名空间中)。我面临找不到 Temp 命名空间的错误。我发现这个映射很有用: 在移动类时保持 .NET 序列化数据兼容性

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

4

3 回答 3

4

您可以强制新类型在您自己的 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);
}
于 2013-01-28T20:54:28.093 回答
2

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

于 2011-03-01T09:33:33.580 回答
2

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

您也可以将 aSerializationBinder与您的BinaryFormatter. 在 .NET 4.0 中,您可以提供一种BindToName方法作为SerializationBinder允许您在序列化时控制自定义类型名称映射的一部分。

于 2011-11-04T23:58:30.540 回答