4

これは重複していないと思います。いくつか読んだことがありますが、これと同じものは見つかりませんでした。フィールドは、バイナリ フォーマッタと protobuf ではシリアル化できますが、XML ではシリアル化できないようです。JSONについてはわかりません。

標準の .NET バイナリ シリアライザーを protobuf-net に置き換えることを検討しています。その理由は、速度を向上させ、保持されるファイルのサイズを小さくするためです。

NET Binary では、クラスをシリアル化可能としてマークし、そのままにしました。良くないと思います。

protobuf-net では、[ProtoMember()] 属性で何をシリアル化するかを指定する必要があります。私の初心者テストでは、自動プロパティと同様にマークされている場合、プライベートフィールドがシリアル化されることが示されています。

NET シリアライザーによって作成された古い永続データを逆シリアル化する必要があるため、クラス コードの定義をまったく変更したくありません。私は以下の混合物を持っています:

  1. クラス内で使用されるプライベート フィールド
  2. 値がコンストラクターで設定されるプライベート フィールド
  3. 非自動プロパティのバッキング フィールドであるプライベート フィールド
  4. 上記のバッキング フィールドを持つプロパティ
  5. 自動プロパティ
  6. 内部で決定された計算または値を返すセッターのないプロパティ

そしておそらく他のいくつか。つまり、ほぼすべてのタイプのフィールドとプロパティです。

ファイルからの逆シリアル化後に構築できないオブジェクトの状態を表す値を永続化する必要があると思います。

すべてのフィールドとプロパティを永続化しても害はないと思いますが、それではジョブが遅くなり、必要以上にファイルが大きくなります。

クラス内でのみ使用され、外部から設定されないプライベート フィールドは無視できると思います。コンストラクターで設定されたフィールドを永続化する必要があると思います。バッキングフィールドについてよくわかりません-それらまたはそれらのパブリックプロパティを永続化する方が良いですか? 自動プロパティを永続化する必要があります セッターなしでプロパティを永続化できないため、計算で使用されるフィールド/プロパティを永続化する必要があります。

私は正しい軌道に乗っていますか、それともポイントを逃していますか。

前もって感謝します。

4

1 に答える 1

3

何をシリアル化する必要があるかはわかりません。BinaryFormatter「すべてのフィールド」ベースで機能します (シリアル化しないように明示的にマークされていない限り)。同じアプローチを使用できますが、自動的に実装されたプロパティを使用している場合 (これは問題ありません)、バッキング フィールドに属性を追加できないことに注意してください。フィールドのようなイベントとは異なり、以下は有効な c# ではありません

[field:ProtoMember(1)] // not valid
public int X { get; set; }

これは、あなたの唯一の賢明な選択は、プロパティを装飾することであることを意味します:

[ProtoMember(1)]
public int X { get; set; }

自動的に実装されたプロパティを通常のプロパティにBinaryFormatter変更すると、フィールド名が変更されるため、 の逆シリアル化が壊れてしまうためです。ただし、それは問題ありません。シリアル化のためにフィールドまたはプロパティ (または同じ型の両方) をマークすることに問題はありません。一部のプラットフォームでのもう 1 つの考慮事項はアクセシビリティです。プライベート フィールドにはアクセスできない場合がありますが、パブリック フィールドは正常に機能します。そして明らかに public フィールドはかなり珍しいです。

そう:

  • 何をシリアル化する必要があるかを決定します (これについては言えません)
  • シリアル化のためにマークする
  • 作業を続ける必要がある場合は、自動的に実装されたプロパティから通常のプロパティに何も変更しないでくださいBinaryFormatter(これを変更しても、protobuf-net は気にしません)。
于 2012-10-22T15:36:00.477 に答える