-1

高度にカスタマイズされた効率的なバイナリ形式を、利用可能なバイナリ形式のいずれかに移行することを調査しています。データは他の場所の中でも低電力のモバイルに保存されるため、パフォーマンスは重要な要件です。現在の形式の利点は、すべての文字列がプールに格納されることです。これは、ファイル内で同じ文字列を何百回も繰り返さず、逆シリアル化中に 1 回だけ読み取り、すべてのオブジェクトがそのインデックスによって参照していることを意味します。また、メモリ内にコピーを 1 つだけ保持することも意味します。したがって、多くの利点があります:) capnprotoまたはflatbuffersがこれをサポートする方法を見つけることができませんでした。または、レイヤーを上に構築し、生成されたオブジェクトで文字列への整数インデックスを明示的に使用する必要がありますか?

ありがとうございます!

4

2 に答える 2

1

次のように、いつでも手動でこれを行うことができます。

struct MyMessage {
  stringTable @0 :List(Text);

  # Now encode string fields as integer indexes into the string table.
  someString @1 :UInt32;
  otherString @2 :UInt32;
}

Cap'n Proto は理論的には複数のポインターが同じオブジェクトを指すことを許可することができますが、現在はセキュリティ上の理由からこれを禁止しています: 循環するメッセージまたは多くの重複を含むメッセージを送信することによって、それを予期しない DoS サーバーにとって簡単すぎるでしょう。参照。ドキュメントの増幅攻撃に関するセクションを参照してください。

于 2016-01-25T06:10:01.757 に答える
1

FlatBuffers は文字列プーリングをサポートしています。文字列を 1 回シリアル化し、その文字列を他のオブジェクトで複数回参照するだけです。文字列はメモリ内で 1 回だけ発生します。

最も単純な例、スキーマ:

table MyObject { name: string; id: string; }

コード (C++):

FlatBufferBuilder fbb;
auto s = fbb.CreateString("MyPooledString");
// Both string fields point to the same data:
auto o = CreateMyObject(fbb, s, s);
fbb.Finish(o);
于 2016-01-24T17:52:08.867 に答える