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;
}

後で、次の 1 つ以上によってこのクラスをリファクタリングしたい
- 名前を変更する -
名前空間を変更する
- 別のアセンブリに移動する

私が知る限り、バイナリ ファイルは、まったく同じ名前、名前空間、およびアセンブリ名を持つクラスが利用可能な場合にのみ逆シリアル化できます。

これを回避するにはどうすればよいですか? バージョン トレラント
シリアル化を壊すことなく、逆シリアル化を別のクラス名、名前空間、およびアセンブリにマップすることは可能ですか?

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 に答える