协议缓冲区中的字典

时间:2010-11-16 13:53:47

标签: serialization protocol-buffers thrift

有没有办法使用协议缓冲区序列化字典,或者我需要使用Thrift?

4 个答案:

答案 0 :(得分:34)

人们通常会将字典写为键值对列表,然后在另一端重建字典。

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

message Dictionary {
   repeated Pair pairs = 1;
}

答案 1 :(得分:25)

对于未来的求职者,ProtoBuf now supports Maps本地地:

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

答案 2 :(得分:0)

您可以查看ProtoText包。

假设您要将字典person_dict序列化为PersonBuf模块中定义的预定义personbuf_pb2 protobuf对象。

在这种情况下,要使用ProtoText,

import ProtoText
from personbuf_pb2 import PersonBuf

obj = PersonBuf()
obj.update(person_dict)

答案 3 :(得分:0)

我首先评论@Flassari的答案,因为它真的很方便。

但是,就我而言,我需要map<Type, repeated AnyModel>其中:

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

message AnyModel {
    string Name = 1;
}

在这里,我只想返回一个字典,每种类型都包含一个AnyModel列表

但是,我发现没有比@JesperE提出的解决方案更好的解决方法,因此我做了以下工作:({as you can't use enum as key in map

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的有效答案,具体取决于您的要求。