7

我有一个由BinaryFormatter序列化到磁盘的 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;
}

后来,我想通过以下一项或多项来重构这个类
- 更改其名称
- 更改其命名空间
- 移动到另一个程序集

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

我该如何解决这个问题?是否可以在不破坏Version Tolerant Serialization
的情况下将反序列化映射到不同的类名、命名空间和程序集?

4

2 回答 2

5

经过一番研究,我意识到 BinaryFormatter 确实支持我正在寻找的一切。

BinaryFormatter 可以使用代理

  1. 提供序列化最初未设计为序列化的类型的能力。
  2. 提供一种将一个类型的一个版本映射到另一个类型的另一个版本的方法。

还可以使用SerializationBinder将反序列化从类型 A 映射到类型 B(不同的类名、命名空间和/或程序集名称) 。

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

参考:http ://www.diranieh.com/NETSerialization/BinarySerialization.htm

编辑:在旁注中,重构字段(名称或类型)仍然很痛苦,如重命名字段然后在 C# 中反序列化中所述。我目前正在研究 protobuf-net 以在未来更好地解决这个问题。

于 2010-09-28T07:07:58.913 回答
1

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

于 2010-08-23T07:46:37.783 回答