代码之家  ›  专栏  ›  技术社区  ›  angularsen Bcelik

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

  •  7
  • angularsen Bcelik  · 技术社区  · 14 年前

    我有一个C类,由 BinaryFormatter

    // 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 ?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Community CDub    8 年前

    经过一些研究,我意识到二进制格式化程序确实支持我所寻找的一切。

    二进制格式化程序可以使用

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

    序列化活页夹

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

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

        2
  •  1
  •   Albin Sunnanbo    14 年前

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