2

Google protobuf を使用して、シリアル化されたメッセージ データをファイルに保存しています。各ファイルには複数のメッセージがあります。コードには C++ と Python の両方のバージョンがあるため、両方の言語で使用できる protobuf 関数を使用する必要があります。SerializeToArray と SerializeAsString を使用して実験しましたが、次のような不幸な状況があるようです:

  1. SerializeToArray: 1 つの回答で示唆されているように、これを使用する最善の方法は、各メッセージの前にデータ サイズを付けることです。これは C++ ではうまく機能しますが、Python ではこれが可能ではないように見えます - 私は間違っていますか?

  2. SerializeAsString: これにより、対応するバイナリに相当するシリアル化された文字列が生成されます。これはファイルに保存できますが、シリアル化の結果の文字の 1 つが \n の場合はどうなるでしょうか。その問題?

アップデート:

少し言い換えさせてください。私が理解しているように、C++ でバイナリ データを書き込むことはできません。これは、Python アプリケーションがデータを読み取れないためです。これは、シリアル化された文字列のメッセージしか解析できないためです。SerializeAsString代わりに、C++ と Python の両方で使用する必要がありますか? はいの場合、そのようなデータをバイナリ ファイルではなくテキスト ファイルに格納するのがベスト プラクティスですか? 私の直感は二者択一ですが、ご覧のとおり、これは選択肢のようには見えません。

4

3 に答える 3

5

この方法でメッセージを連結するためのベスト プラクティスは、各メッセージの先頭にそのサイズを追加することです。そうすれば、サイズを読み込んで(32ビットのintなどを試してください)、そのバイト数をバッファに読み込んでデシリアライズします。次に、次のサイズなどを読み取ります。

同じことが書き込みにも当てはまります。最初にメッセージのサイズを書き出し、次にメッセージ自体を書き出します。

詳細については、protobuf ドキュメントの複数のメッセージのストリーミングを参照してください。

于 2009-12-07T10:56:46.017 に答える
5

We have had great success base64 encoding the messages, and using a simple \n to separate messages. This will ofcoirse depend a lot on your use - we need to store the messages in "log" files. It naturally has overhead encoding/decoding this - but this has not even remotely been an issue for us.

The advantage of keeping these messages as line separated text has so far been invaluable for maintenance and debugging. Figure out how many messages are in a file ? wc -l . Find the Nth message - head ... | tail. Figure out what's wrong with a record on a remote system you need to access through 2 VPNs and a citrix solution ? copy paste the message and mail it to the programmer.

于 2010-04-20T18:15:56.157 に答える
0

Protobuf はバイナリ形式であるため、読み書きはテキストではなくバイナリとして行う必要があります。バイナリ形式が必要ない場合は、protobuf 以外のものを使用することを検討する必要があります (XML、JSON、CSV など、多くのテキスト データ形式があります)。テキストの抽象化を使用するだけでは十分ではありません。

于 2011-12-20T06:03:01.850 に答える