Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以通过“恢复”恢复序列化的对象;“二进制格式化程序”;在更改类名之后?_C#_.net_Binaryformatter - Fatal编程技术网

C# 是否可以通过“恢复”恢复序列化的对象;“二进制格式化程序”;在更改类名之后?

C# 是否可以通过“恢复”恢复序列化的对象;“二进制格式化程序”;在更改类名之后?,c#,.net,binaryformatter,C#,.net,Binaryformatter,我正在使用BinaryFormatter存储我的应用程序设置。现在,经过几年的持续开发,在许多用户已经在使用我的应用程序之后,我想更改几个类的命名方式以及它们所在的名称空间。但是,如果我这样做,就不可能再加载设置,因为binaryformatter通过它们的代码名调用东西 因此,例如,如果我在代码中将MyNamespace.ClassOne更改为MyNamespace.Class.NumberOne,我将无法再加载设置,因为MyNamespace.ClassOne不再存在 我想进行此更改并允许用

我正在使用
BinaryFormatter
存储我的应用程序设置。现在,经过几年的持续开发,在许多用户已经在使用我的应用程序之后,我想更改几个类的命名方式以及它们所在的名称空间。但是,如果我这样做,就不可能再加载设置,因为
binaryformatter
通过它们的代码名调用东西

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

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


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

是的,这是可能的。你可以使用这个类。大概是这样的:

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();

代码示例改编自。

还有其他二进制序列化程序,它们与类区域性程序集无关。ProtoBuf net就是其中之一,我认为CodeProject上的NetSerializer也是。