Serialization 协议缓冲区中的字典

Serialization 协议缓冲区中的字典,serialization,protocol-buffers,thrift,Serialization,Protocol Buffers,Thrift,是否有任何方法可以使用协议缓冲区序列化字典,或者如果需要,我必须使用Thrift?Protobuf规范 原始答案 人们通常将字典写为键值对列表,然后在另一端重建字典 message Pair { string key = 1; string value = 2; } message Dictionary { repeated Pair pairs = 1; } 你可以检查一下包裹 假设您要将dictperson\u dict序列化为在PersonBuf\u pb2模块中定义

是否有任何方法可以使用协议缓冲区序列化字典,或者如果需要,我必须使用Thrift?

Protobuf规范

原始答案 人们通常将字典写为键值对列表,然后在另一端重建字典

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

message Dictionary {
   repeated Pair pairs = 1;
}
你可以检查一下包裹

假设您要将dict
person\u dict
序列化为在
PersonBuf\u pb2
模块中定义的预定义
PersonBuf
protobuf对象

在本例中,要使用原始文本

import ProtoText
from personbuf_pb2 import PersonBuf

obj = PersonBuf()
obj.update(person_dict)

对于未来的寻求答案者,本机:

message MapMessage
{
    map<string, string> MyMap = 1;
}
消息映射消息
{
map MyMap=1;
}

我首先评论@Flassari的答案,因为它非常方便

但是,在我的情况下,我需要
map
其中:

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

message AnyModel {
    string Name = 1;
}
这里我只想返回一个字典,对于每种类型,它都包含一个AnyModel的列表

但是,我没有找到比@JesperE建议的更好的解决方法,所以我做了以下工作:()

消息MyRPCBodyCall{
地图模型=1;
}
枚举类型{
未定义=0;
平方=1;
圆圈=2;
}
消息AnyModel{
字符串名称=1;
}
消息AnyModelArray{
重复的AnyModel AnyModels=1;
}
在这里,我使用从服务器/客户端选择的代码语言将枚举从/转换为字符串


因此,这两种方法实际上都是有效的答案,具体取决于您的需求。

重复不是真正的重复。这个问题是关于.net绑定的。OP没有指定语言环境。有没有办法对动态类型执行相同的操作?我有一本需要序列化的
词典我正在尝试调查协议缓冲区是否可以不费吹灰之力就完成这项工作。不,Protobuf不是一个通用的对象序列化协议。您需要为所有要序列化的数据定义protobuf消息。(老实说,如果你有一个映射,你应该首先重构你的代码。)@Mike你必须为它可能是的每种类型创建一个字段,这是一个等待发生的错误。请注意,映射仍然不能重复。映射是集合,它们已经根据定义重复了。链接用于proto2语法,但地图也有proto3版本-
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;
}