45

有什么方法可以使用协议缓冲区序列化字典,或者如果需要,我将不得不使用 Thrift?

4

4 回答 4

63

对于未来的答案寻求者,ProtoBuf 现在原生支持 Maps

message MapMessage
{
    map<string, string> MyMap = 1;
}
于 2016-11-14T09:46:57.263 回答
55

Protobuf 规范现在原生支持字典(地图)

原始答案

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

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

message Dictionary {
   repeated Pair pairs = 1;
}
于 2010-11-17T12:33:00.793 回答
1

您可以检查ProtoText包。

假设您要将 dict 序列化为模块中person_dict定义的预定义PersonBufprotobuf 对象。personbuf_pb2

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

import ProtoText
from personbuf_pb2 import PersonBuf

obj = PersonBuf()
obj.update(person_dict)
于 2015-11-15T22:12:23.823 回答
0

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

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

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

message AnyModel {
    string Name = 1;
}

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

但是,我没有找到比@JesperE 提出的更好的解决方法,所以我做了以下事情:(因为你不能在 map 中使用 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 的有效答案,具体取决于您的要求。

于 2020-01-13T14:47:50.070 回答