我曾经使用 BinaryFormatter (c#) 序列化树视图。执行此操作并包含所有可序列化类的程序集现在具有强名称并已签名,并且还获得了新的版本号(但是,实现没有改变)。
当我尝试反序列化 byte[] 数组时,该行
(TreeViewData)binaryFormatter.Deserialize(memoryStream);
产生 ArgumentNullException。 (参数名称:类型)
我认为版本号是问题,所以我实现了一个自己的Binder。我重写了 BindToType 方法,并确保版本已更正并返回正确的类型。
然而,就在程序离开 BindToType 方法的那一刻,我仍然得到上面提到的异常。
我该如何解决?
您可以使用SerializationBinder
解决这个问题:
private class WeakToStrongNameUpgradeBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
try
{
//Get the name of the assembly, ignoring versions and public keys.
string shortAssemblyName = assemblyName.Split(',')[0];
var assembly = Assembly.Load(shortAssemblyName);
var type = assembly.GetType(typeName);
return type;
}
catch (Exception)
{
//Revert to default binding behaviour.
return null;
}
}
}
Then
var formatter = new BinaryFormatter();
formatter.Binder = new WeakToStrongNameUpgradeBinder();
瞧,您的旧序列化对象可以使用此格式化程序反序列化。如果类型也发生了变化,您可以使用SerializationSurrogate
将旧类型反序列化为新类型。
正如其他人提到的,进行自己的序列化而不是依赖IFormatter
是一个好主意,因为您可以更好地控制版本控制和序列化大小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)