ホームページ >バックエンド開発 >Python チュートリアル >元の言葉を書き直しました: 予期せぬ発見は、当初バグとみなされていたものが、実際には Protobuf の設計上の機能であるということです。
みなさんこんにちは、私はすごいです。
最近、私たちのプロジェクトでは、データを保存するためのキャリアとして protobuf 形式を使用しています。うっかり大きな穴を自分で埋めてしまいましたが、発見するまでに時間がかかりました。
protobuf の正式名は Protocol Buffers で、Google によって開発され、クロス言語、クロスプラットフォーム、スケーラブルなシリアル化データ メカニズムです。 XML に似ていますが、XML よりも小さく、高速で、シンプルです。データの構造を一度定義するだけで、その生成ツールを使用して、シリアル化および逆シリアル化操作を含むソース コードを生成できます。構造化データは、さまざまなプログラミング言語を使用して、さまざまなデータ ストリームに対して簡単に書き込みおよび読み取りを行うことができます。
proto2 バージョンは、Java、Python、Objective-C、および C でのコード生成をサポートしています。新しい proto3 言語バージョンでは、Kotlin、Dart、Go、Ruby、PHP、C# など多くの言語も使用できます。 #########どうやって分かったの?
message ImageData { // ms int64 timestamp = 1; int32 id = 2; Data mat = 3; } message PointCloud { // ms int64 timestamp = 1; int32 id = 2; PointData pointcloud = 3; } message State { // ms int64 timestamp = 1; string direction = 2; } message Sensor { repeated PointCloud point_data = 1; repeated ImageData image_data = 2; repeated State vehicle_data = 3; }
一連のデータを区切り操作を行わずに 1 つのパッケージに保存します。 protobuf が解析すると、ファイル内のすべての内容が 1 つのセンサーに解析されます。センサーにはすべてのデータが含まれており、protobuf は保存されているすべてのデータをアクティブにマージします。
このとき、過去にシングルパケットを記録したときはすべて正しいデータだったことがわかり、本当に幸運でした。 protobuf はたまたま正常に解析されました。
どうすれば解決できますか?
bool SerializeDelimitedToOstream(const MessageLite& message, std::ostream* output); bool ParseDelimitedFromZeroCopyStream( MessageLite* message, io::ZeroCopyInputStream* input, bool* clean_eof);この 2 つのメソッドにより、データ フローに従ってファイルを 1 つずつ保存し、読み取ることができます。データのマージや読み取りについて心配する必要はもうありません。 もちろん、この方法で保存されたデータは、元の解析方法では解析できず、ストレージの形式は完全に変更されています。このメソッドは、最初にバイナリ データのサイズを保存し、次にバイナリ データを保存します。
結論
以上が元の言葉を書き直しました: 予期せぬ発見は、当初バグとみなされていたものが、実際には Protobuf の設計上の機能であるということです。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。