6

.net アプリでのシリアル化に関するアドバイスを探しています。アプリはデスクトップ/シック クライアント アプリであり、シリアル化は永続化されたドキュメント形式を表します。シリアライザの要件は次のとおりです。

  • パブリック プロパティのみではなく、フィールドのシリアル化を許可する必要があります。
  • パラメーターなしのコンストラクターを要求してはなりません。
  • 一般的なオブジェクト グラフ、つまり DAG だけでなく共有/双方向参照を処理する必要があります。
  • フレームワーク クラスで動作する必要があります (例: Serialize Dictionaries)。

現在、上記のすべてをうまく処理する BinaryFormatter を使用していますが、サイズ/パフォーマンスとバージョンの許容範囲が問題です。[OnDeserialized/ing] 属性を使用して互換性を提供していますが、サロゲートなどの複雑な使用なしに大規模なリファクタリング (名前空間の変更など) を行うことはできません。

理想的な解決策は、既存の [NonSerialized] 注釈などで動作する BinaryFormatter のドロップイン置換ですが、パフォーマンスが向上し、より小さくて維持しやすい形式を生成します。

私はさまざまな protobuf の実装を見てきましたが、最近では一般的なオブジェクト グラフ/列挙型/構造体をシリアル化することは可能であるように見えますが、多くのフレームワーク コレクション タイプなどを含む複雑なグラフをシリアル化することは簡単ではないようです。プロパティではなくフィールドで機能させることができますが、すべてのクラスにパラメーターなしのコンストラクターと protobuf 注釈を追加する必要があることを理解しています (ドメインは約 1000 クラスです)。

だから質問:

  • 十分に文書化された形式を提供し、パフォーマンスが向上する「代替」のバイナリフォーマッタはありますか?
  • プロトコル バッファは、フレームワーク タイプを含む大規模な一般オブジェクト グラフの永続化に適していますか?
4

2 に答える 2

5

形式としてのプロトコル バッファには、オブジェクト グラフの公式サポートはありませんが、protobuf-netこれを提供し、他の要件を満たします。ポイントを順番に取得するには:

  • パブリック プロパティのみではなく、フィールドのシリアル化を許可する必要があります

もちろん; protobuf-net は、公開フィールドと非公開フィールドの両方でこれを行うことができます。実行時または属性を介してフィールドについて伝える

  • パラメーターなしのコンストラクターを要求してはなりません。

これは「v2」で利用可能です-繰り返しますが、実行時にコンストラクターをスキップするか、属性を介して(SkipConstructor=trueコントラクトで)コンストラクターをスキップするように指示できます

  • 一般的なオブジェクト グラフ、つまり DAG だけでなく共有/双方向参照を処理する必要があります。

もちろん; AsReference=trueメンバーに印をつける

  • フレームワーク クラスで動作する必要があります (例: Serialize Dictionaries)。

標準のリストと辞書は正常に機能します。ただし、辞書AsReference でサポートする未解決の変更要求があります。つまり、現在のグラフ コードは実行されDictionary<string, Foo>ませんが、これが原因で大きな問題が発生している場合は、これを確認する時間がおそらくあると思います。Foo

  • [OnDeserialized/ing] 属性を使用して互換性を提供します

シリアル化コールバックは完全にサポートされています

  • ただし、サロゲートなどを複雑に使用しないと、大規模なリファクタリング (名前空間の変更など) はできません。

名前空間などはprotobuf-netにとってまったく興味深いものではありません(DynamicTypeオプションを使用していない限り)

  • パラメーターなしのコンストラクターと protobuf アノテーションをすべてのクラスに追加する必要があることを意味します。

必ずしも; フィールド名を変更しないことを保証できる場合は、フィールド番号を内部的に推測するように依頼できます。最終的に「v2」では、実行時にすべてを指定できるため、多くの場合、次の場所で実行される小さな構成ループを記述できます。 app-startup を使用し、リフレクションを使用してシステムを構成します。その場合、既存のコードをまったく変更する必要はありません。

于 2011-08-03T09:04:56.087 に答える
0

db4oを試してみてください。実際にはシリアライザーではありませんが、要件 (複雑な型、深いグラフ、継承?、辞書など) を満たしていると言える限り、オブジェクトで何も変更する必要はなく、API は非常に優れています。使いやすい。

スキーマのバージョン管理/マージをサポートしています。

于 2011-08-03T09:01:03.853 に答える