2010-11-16 190 views
15

有没有什么办法来序列字典使用协议缓冲区,或者我会,如果我需要使用储蓄?字典在协议缓冲区

+0

复制http://stackoverflow.com/questions/3874024/how-does- protobuf-net-support-for-dictionary-keyvaluepair-works – 2010-11-16 14:00:12

+1

不是真的重复。这个问题是关于.net绑定的。 OP没有指定语言环境。 – JesperE 2010-11-17 12:29:59

回答

28

人们通常写下字典作为键 - 值对的列表,然后重建另一端的字典。

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

message Dictionary { 
    repeated Pair pairs = 1; 
} 
+1

有没有办法用动态类型做同样的事情?我有一个'Dictionary '我需要序列化。 = /正在尝试调查以查看协议缓冲区是否可以在不付出巨大努力的情况下执行此操作。 – mpontillo 2011-03-09 20:18:02

+3

好吧,没有。 Protobuf不是一个通用对象序列化协议。您需要为所有要序列化的数据定义protobuf消息。 (老实说,如果你有一个<字符串,对象>地图,你应该通过重构你的代码开始。) – JesperE 2011-03-10 06:53:07

+0

@Mike你将不得不创建一个字段为每个类型就可以* *是,这是一个bug只是在等待发生。 – 2015-08-09 01:01:38

0

您可以检查ProtoText包。

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

在这种情况下,使用ProtoText,

import ProtoText 
from personbuf_pb2 import PersonBuf 

obj = PersonBuf() 
obj.update(person_dict) 
11

对于未来的答案求职者,ProtoBuf now supports Maps本身:

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

请注意,地图仍然不能重复。 – mattes 2018-03-05 20:06:30