您可以使用 aSerializationBinder
来解决此问题:
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;
}
}
}
然后
var formatter = new BinaryFormatter();
formatter.Binder = new WeakToStrongNameUpgradeBinder();
瞧,您的旧序列化对象可以使用此格式化程序反序列化。如果类型也发生了变化,您可以使用 aSerializationSurrogate
将旧类型反序列化为新类型。
正如其他人所提到的,进行自己的序列化而不是依赖IFormatter
是一个好主意,因为您可以更好地控制版本控制和序列化大小。