3

私はファイルに対してバイナリシリアル化を行うことを検討してきましたが、protobuf-netは優れた代替手段のようです。しかし、私は少し立ち往生しています。クラスの定義を実際のシリアル化から切り離したいので、属性は使用していませんが、.protoファイルを使用することを選択しているので、オブジェクトの構造を取得しました(私は思います)

message Post {

  required uint64 id = 1;

  required int32 userid = 2;

  required string status= 3;

  required datetime created = 4;

  optional string source= 5;

}

(日時は有効ですか、それともint64としてティックを使用する必要がありますか?)

しかし、protogenを使用してから、IEnumerable of Postをファイルにシリアル化して、それを読み戻す方法に固執しています。どんな助けでもいただければ幸いです

別の関連する質問は、シリアル化中にコンピューターがシャットダウンされた場合など、破損したバイナリファイルを検出するためのベストプラクティスはありますか?

4

1 に答える 1

2

Re DateTime... これ標準のプロトタイプ タイプではありません。BCL.DateTime (または同様のもの) を自分のライブラリに追加しました。これは、protobuf-net が使用する内部シリアル化と一致することを目的としていDateTimeますが、コード ジェネレーターを (まだ) 更新していないことは確かです。これを特殊なケースとして検出します。私に試してもらいたい場合は、追加するのはかなり簡単です...最大限の移植性が必要な場合は、「ティック」スタイルのアプローチが実用的かもしれません。お知らせ下さい...

ファイルへの再シリアライズ -はじめにの例とほぼ同じである必要がありますが、protobuf-net は再構築可能なデータを操作する必要があることに注意してください。問題が発生する可能性がありますが、問題はありません( 再構築時に具象型としてデフォルト設定されます)。IEnumerable<T>IList<T>List<T>

破損 (おそらく使用SerializeWithLengthPrefix) に関しては、メッセージの境界 (他の方法では EOF として検出できない場所) でも問題を検出できます。これは (名前が示すように) 最初に長さを書き込むため、十分なデータがあるかどうかを ( 経由でDeserializeWithLengthPrefix) 認識します。または、ハッシュ/チェックサム用にファイルの最初の [n] バイトを予約します。この空白のスペーサーを書き込み、次にデータを書き込み、ハッシュ/チェックサムを計算し、先頭を上書きします。逆シリアル化中に検証します。はるかに多くの作業。

于 2009-12-07T07:34:03.000 に答える