web-dev-qa-db-ja.com

プロトコルバッファ内の辞書

プロトコルバッファーを使用して辞書をシリアル化する方法はありますか、それが必要な場合はThriftを使用する必要がありますか?

30
ibz

ユーザーは通常、辞書をキーと値のペアのリストとして書き留めてから、反対側で辞書を再構築します。

message Pair {
   optional string key = 1;
   optional string value = 2;
}

message Dictionary {
   repeated Pair pairs = 1;
}
36
JesperE

今後の回答シーカーのために、 ProtoBufはマップをサポートするようになりました ネイティブ:

message MapMessage
{
    map<string, string> MyMap = 1;
}
28
Flassari

ProtoText パッケージを確認できます。

Dict person_dictpersonbuf_pb2モジュールで定義された事前定義済みPersonBuf protobufオブジェクトにシリアル化するとします。

この場合、ProtoTextを使用するには、

import ProtoText
from personbuf_pb2 import PersonBuf

obj = PersonBuf()
obj.update(person_dict)
0
Zheng Xu

@Flassariの回答は本当に便利なので、最初にコメントします。

ただし、私の場合、map<Type, repeated AnyModel> どこ :

enum Type {
    Undefined = 0;
    Square = 1;
    Circle = 2;
}

message AnyModel {
    string Name = 1;
}

ここでは、タイプごとにAnyModelのリストを含む辞書を返したいだけです。

ただし、@ JesperEによって提案された回避策よりも良い回避策が見つからなかったため、次のようにしました:enumをキーとしてマップで使用できないため =)

message MyRPCBodyCall {
    map<string, AnyModels> Models = 1;
}

enum Type {
    Undefined = 0;
    Square = 1;
    Circle = 2;
}

message AnyModel {
    string Name = 1;
}

message AnyModelArray {
    repeated AnyModel AnyModels = 1;
}

ここでは、サーバー側とクライアント側の両方から選択したコード言語を使用して、列挙型を文字列から/に変換します

したがって、両方のアプローチは実際にはIMOの有効な回答です。要件によって異なります。

0
Emixam23