0

私は非常にモジュール化されたシステムで作業しています。メッセージは、src、dest、type の 3 タプルで判別できます。

プロトコル バッファを使用してメッセージを再実装することを検討しています。Protocol buffer polymorphismを読みましたが、プロトコル バッファでポリモーフィズムを行う正しい方法は何ですか? およびhttp://www.indelible.org/ink/protobuf-polymorphism/

私が疑問に思っているのは、次のようなソリューションを実装した人がいるということです。

message header {
    required string src = 1
    required string dest = 2
    required string type = 3
}

そして、次の場合に個別のメッセージを作成します。

message foo {
    required header h = 1
    required string a = 2
}

別ファイル:

message bar {
    required header h = 1
    required uint32 num = 2
}

受信コードには次のようなものがあります。

Message.ParseFromString(msgStr)
if (Message.type == foo)
{
  FooMessage.ParseFromString(msgStr)
}
else {
    BarMessage.ParseFromString(msgStr)
}

このアプローチが使用された場合、上記のリンクで説明されているものよりも良いですか、それとも悪いですか?

4

1 に答える 1

2

私が見つけた唯一の方法は、メッセージ本文をバイト配列としてシリアライズ/デシリアライズすることです。次に、必要なレベルの抽象化を取得します。

message header {
    required string src = 1;
    required string dest = 2;
    required string type = 3;
}

message foo {
    required string a = 2;
}

message bar {
    required uint32 num = 2;
}

message request {
    required header h;
    required bytes data; // serialize foo or bar here
}

次に、コードは次のようになります (これは疑似コードです)。

request req = request.ParseFromString(buffer);

if (req.h().type() == "foo") {
    foo msg = foo.ParseFromString(req.data);
    // process foo msg
}
else if (req.h().type() == "bar") {
    bar msg = bar.ParseFromString(req.data);
    // process bar msg
}
于 2013-04-07T08:32:05.800 に答える