Boost.serialization
分散システム設計で使用されるプロトコルバッファに置き換える予定です。プロトコルバッファは標準コンテナなどの複雑なデータ構造をどのようにサポートしていますか?
たとえば、このようなクラスは、この場合、シリアル化/逆シリアル化する必要があります。
class Foo
{
std::vector< std::pair< unsigned int, std::vector< std::pair< int, int> > > > data;
};
Boost.serialization
分散システム設計で使用されるプロトコルバッファに置き換える予定です。プロトコルバッファは標準コンテナなどの複雑なデータ構造をどのようにサポートしていますか?
たとえば、このようなクラスは、この場合、シリアル化/逆シリアル化する必要があります。
class Foo
{
std::vector< std::pair< unsigned int, std::vector< std::pair< int, int> > > > data;
};
Fooのprotobuf表現は次のようになります。
message IntPair {
required int32 first = 1;
required int32 second = 2;
};
message FooElem {
required uint32 first = 1;
repeated IntPair second = 2;
};
message Foo {
repeated FooElem data = 1;
};
Protocol Buffersは、Boost.Serializationのように、独自の構造との間で「シームレスな」(逆)シリアル化を提供しないことに注意してください。protoc
上記のようなファイルでコンパイラを実行して生成されたオブジェクトを操作します。
ただし、これらの生成されたクラスにはメンバーが含まれないstd::pair
ため、レガシー構造std::vector
での作業を継続する場合は、生成されたオブジェクトからデータもコピーする必要があります。Foo
プロトコル バッファには、.proto ファイルを取得して適切なシリアル化ルーチンを作成するパーサーが採用されています。これを参照してください。
更新:文字列のベクトルを次のように表すことができます。
message MyCollection {
repeated string str = 1;
}
あなたのプロトファイルで。
そして使用:
std::vector<std::string> my_strings;
// add strings to vector MyCollection proto;
vector<string>::iterator e = my_strings.end();
for (vector<string>::iterator i = my_strings.begin();
i != e;
++i) {
*proto.add_str() = *i;
}
別のコレクション/コレクションのコレクションに簡単に拡張できるはずです。