我已经序列化了一个曾经位于命名空间 Temp 中的类,但现在我在另一个命名空间中反序列化(我的意思是我用来获取对象的类当前驻留在另一个命名空间中)。我面临找不到 Temp 命名空间的错误。我发现这个映射很有用: 在移动类时保持 .NET 序列化数据兼容性。
有没有办法只序列化类对象而不是程序集信息或命名空间信息?(我正在考虑未来的变化并摆脱这种映射)。
我已经序列化了一个曾经位于命名空间 Temp 中的类,但现在我在另一个命名空间中反序列化(我的意思是我用来获取对象的类当前驻留在另一个命名空间中)。我面临找不到 Temp 命名空间的错误。我发现这个映射很有用: 在移动类时保持 .NET 序列化数据兼容性。
有没有办法只序列化类对象而不是程序集信息或命名空间信息?(我正在考虑未来的变化并摆脱这种映射)。
您可以强制新类型在您自己的 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);
}
最容易处理的是AppDomain.TypeResolve
事件。
当您创建一个BinaryFormatter
序列化数据时,您可以将AssemblyFormat
属性设置为FormatterAssemblyStyle
.Simple。这将导致仅序列化程序集名称,而不是整个版本限定的完整程序集名称。
您也可以将 aSerializationBinder
与您的BinaryFormatter
. 在 .NET 4.0 中,您可以提供一种BindToName
方法作为SerializationBinder
允许您在序列化时控制自定义类型名称映射的一部分。