2009-03-26 14 views
4

Boost.serializationを、分散システム設計で使用されるプロトコルバッファに置き換える予定です。プロトコルバッファが標準コンテナなどの複雑なデータ構造をサポートする方法例えばプロトコルバッファは、標準コンテナのシリアル化/逆シリアル化をどのようにサポートできますか?

は、そのようなクラスは、我々の場合には非直列化/直列化する必要がある:

class Foo 
{ 
    std::vector< std::pair< unsigned int, std::vector< std::pair< int, int> > > > data; 
}; 

答えて

4

プロトコルバッファは.protoファイルを取り、適切なシリアル化ルーチンを作成するパーサを採用しています。 thisを参照してください。

更新:あなたのプロト・ファイル内の

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; 
} 

と使用。

+0

Googleのチュートリアルでは、シンプルな構造をシリアル化する方法についてのみ説明しています。私の要件は、標準のコンテナについてです。上記のようにprotoファイルを書き込む方法は? –

+1

いくつかのコードで更新されました。 – dirkgently

4

あなたの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; 
}; 

Boost.Serializationが行うようプロトコルバッファは、独自の構造からの/「シームレス」(デ)シリアライズを提供していないことに注意してください。上記のようなファイルにprotocコンパイラを実行して生成されたオブジェクトで作業します。

これらの生成されたクラスにはstd::pairstd::vectorのメンバーは含まれません。したがって、従来のFoo構造を使用し続けるには、生成されたオブジェクトからデータをコピーする必要があります。

関連する問題