是否有可能恢复通过" BinaryFormatter"序列化的对象?更改课程名称后?

时间:2014-09-06 14:53:32

标签: c# .net binaryformatter

我使用BinaryFormatter来存储我的应用程序设置。现在,经过几年的持续开发,在许多用户已经在使用我的应用程序之后,我想要更改几个类的命名方式以及它们所在的命名空间。但是,如果我这样做,则无法再加载设置,因为BinaryFormater通过其代码内名称调用事物。

因此,例如,如果我在代码中将MyNamespace.ClassOne更改为MyNamespace.Class.NumberOne,则无法再加载设置,因为MyNamespace.ClassOne已不存在。

我希望进行此更改并允许用户保留其设置文件。这可能吗?

我的意思是,我想我可以研究它保存的格式,并手动更改二进制文件,替换类名,但这将是黑客的方法。必须有一个正常的方法,对吗?

1 个答案:

答案 0 :(得分:10)

是的,有可能。您可以使用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();

代码示例改编自this answer