プロトコルバッファーを使用して辞書をシリアル化する方法はありますか、それが必要な場合はThriftを使用する必要がありますか?
ユーザーは通常、辞書をキーと値のペアのリストとして書き留めてから、反対側で辞書を再構築します。
message Pair {
optional string key = 1;
optional string value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
今後の回答シーカーのために、 ProtoBufはマップをサポートするようになりました ネイティブ:
message MapMessage
{
map<string, string> MyMap = 1;
}
ProtoText パッケージを確認できます。
Dict person_dict
をpersonbuf_pb2
モジュールで定義された事前定義済みPersonBuf
protobufオブジェクトにシリアル化するとします。
この場合、ProtoTextを使用するには、
import ProtoText
from personbuf_pb2 import PersonBuf
obj = PersonBuf()
obj.update(person_dict)
@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の有効な回答です。要件によって異なります。