2010-11-16 185 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