Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
如何重构在.NET中序列化的类?_.net_Serialization_Refactoring_Versioning_Binaryformatter - Fatal编程技术网

如何重构在.NET中序列化的类?

如何重构在.NET中序列化的类?,.net,serialization,refactoring,versioning,binaryformatter,.net,Serialization,Refactoring,Versioning,Binaryformatter,我有一个C#类,由序列化到磁盘,如以下示例: // Version 3.0 [Serializable] public class Person { public string FullName; [OptionalField(VersionAdded=2)] public string NickName; [OptionalField(VersionAdded=2)] public DateTime BirthDate; [OptionalF

我有一个C#类,由序列化到磁盘,如以下示例:

// Version 3.0
[Serializable]
public class Person
{
    public string FullName;

    [OptionalField(VersionAdded=2)]
    public string NickName;
    [OptionalField(VersionAdded=2)]
    public DateTime BirthDate;

    [OptionalField(VersionAdded=3)]
    public int Weight;
}
稍后,我想通过以下一个或多个方法重构这个类
-更改其名称
-更改其名称空间
-移动到另一个部件

据我所知,只有当具有完全相同名称、命名空间和程序集名称的类可用时,才能反序列化二进制文件

如何解决这个问题?

是否可以在不中断的情况下将反序列化映射到不同的类名、命名空间和程序集?

您可以实现接口并重写以提供自己的反序列化。我没有尝试过,但您应该能够“手动”反序列化旧对象。

经过一些研究,我意识到BinaryFormatter确实支持我所寻找的一切

BinaryFormatter可以使用代理来

  • 提供序列化最初未设计为序列化的类型的功能
  • 提供将类型的一个版本映射到另一个类型的另一个版本的方法
  • 还可以使用SerializationBinder将反序列化从类型A映射到类型B(不同的类名、命名空间和/或程序集名)

    据我所知,这使得重构序列化的类成为可能,并在进行版本控制不支持的破坏性更改时保持向后兼容性

    参考:


    编辑:另一方面,重构字段(名称或类型)仍然是一个难题,如中所述。我目前正在研究protobuf net,以便在将来更好地解决这个问题。

    那么您的意思是说Person应该实现ISerializable和GetObjectData()?当反序列化程序具有不同的名称、命名空间和/或程序集时,它如何知道应该使用这个确切的Person类?我能告诉反序列化程序使用哪个类吗?