更改类名后是否可以通过“BinaryFormatter”恢复序列化的对象?
我使用BinaryFormatter
来存储我的应用程序设置。 现在,经过几年的持续开发,在许多用户已经在使用我的应用程序之后,我想要更改几个类的命名方式以及它们所在的命名空间。 但是,如果我这样做,则不再可能加载设置,因为BinaryFormater
通过其代码内名称调用事物。
因此,例如,如果我在代码MyNamespace.ClassOne
MyNamespace.Class.NumberOne
更改为MyNamespace.Class.NumberOne
,则无法再加载设置,因为MyNamespace.ClassOne
不再存在。
我想要进行此更改并允许用户保留其设置文件。 这可能吗?
我的意思是,我想我可以研究它保存的格式,并手动更改二进制文件,替换类名,但这将是黑客的方法。 必须有一个正常的方法,对吗?
对的,这是可能的。 您可以使用SerializationBinder
类。 像这样的东西:
public class ClassOneToNumberOneBinder : SerializationBinder { public override Type BindToType(string assemblyName, string typeName) { typeName = typeName.Replace( "MyNamespace.ClassOne", "MyNamespace.Class.NumberOne"); assemblyName = assemblyName.Replace("MyNamespace", "MyNamespace.Class"); return Type.GetType(string.Format("{0}, {1}", typeName, assemblyName)); } } BinaryFormatter binaryFormatter = new BinaryFormatter(); binaryFormatter.Binder = new ClassOneToNumberOneBinder();
代码示例改编自此答案 。