【发布时间】:2011-05-10 20:08:37
【问题描述】:
有没有办法使用协议缓冲区来序列化字典,或者如果我需要,我必须使用 Thrift?
【问题讨论】:
-
不是真的重复。这个问题是关于 .net 绑定的。 OP 没有指定语言环境。
标签: serialization protocol-buffers thrift
有没有办法使用协议缓冲区来序列化字典,或者如果我需要,我必须使用 Thrift?
【问题讨论】:
标签: serialization protocol-buffers thrift
Protobuf 规范现在 supports dictionaries (maps) natively.
人们通常将字典写成键值对列表,然后在另一端重建字典。
message Pair {
string key = 1;
string value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
【讨论】:
Dictionary<string,object>。 =/ 正在尝试调查协议缓冲区是否可以在不费力的情况下做到这一点。
我首先评论@Flassari 的答案,因为它真的很方便。
但是,就我而言,我需要map<Type, repeated AnyModel> where :
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 的有效答案,具体取决于您的要求。
【讨论】:
对于未来的答案寻求者,ProtoBuf now supports Maps 原生:
message MapMessage
{
map<string, string> MyMap = 1;
}
【讨论】:
您可以查看ProtoText 包。
假设您要将字典 person_dict 序列化为在 personbuf_pb2 模块中定义的预定义 PersonBuf protobuf 对象。
在这种情况下,要使用 ProtoText,
import ProtoText
from personbuf_pb2 import PersonBuf
obj = PersonBuf()
obj.update(person_dict)
【讨论】: