2010-11-16 4 views
15

Есть ли способ сериализации словаря с использованием буферов протокола, или мне придется использовать Thrift, если мне это нужно?Словарь в буферах протоколов

+0

дублируют http://stackoverflow.com/questions/3874024/how-does- protobuf-net-support-for-dictionary-keyvaluepair-works –

+1

Совсем не дублируется. Этот вопрос касался привязок .net. OP не указывает языковую среду. – JesperE

ответ

28

Люди обычно записывают словарь как список пар ключ-значение, а затем перестраивают словарь на другом конце.

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

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

Есть ли способ сделать то же самое с динамическим типом? У меня есть 'Dictionary ', который мне нужно для сериализации. =/Пытался исследовать, чтобы проверить, могут ли буферы протокола делать это без огромных усилий. – mpontillo

+3

Ну, нет. Протобуф не является общим протоколом сериализации объектов. Вам необходимо определить сообщения protobuf для всех данных, которые вы хотите сериализовать. (Честно говоря, если у вас есть карта , вам, вероятно, следует начать с рефакторинга вашего кода.) – JesperE

+0

@Mike Вам нужно будет создать поле для каждого типа, в котором он мог бы быть *, что является ошибкой, ожидающей только бывает. –

0

Вы можете проверить комплект ProtoText.

Предположим, что вы хотите сериализовать dict person_dict на предопределенный объект protobuf PersonBuf, определенный в модуле personbuf_pb2.

В этом случае использовать прототекст,

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

Смежные вопросы