我已经序列化了一个曾经在命名空间Temp中的类,但是现在我在另一个命名空间内反序列化(我的意思是我用来获取当前驻留在另一个命名空间中的对象的类)。我面临着无法找到Temp命名空间的错误。我发现这个映射很有用: Maintain .NET Serialized data compatability when moving classes
有没有办法只是序列化类对象而不是汇编信息或命名空间信息? (我正在考虑未来的变化并摆脱那种映射)。
答案 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
方法,以便在序列化时控制自定义类型名称映射。