Как работает поддержка Protobuf-net для Dictionary / KeyValuePair? - PullRequest
4 голосов
/ 06 октября 2010

Я пытаюсь понять поддержку словаря / KeyValuePair protobuf-net. Мы хотели бы использовать базовый двоичный поток и сгенерированный файл протоки из java, но сгенерированный файл .proto содержит то, что похоже на пользовательский тип с именем Pair_String_Int32.

Может кто-нибудь пролить свет на это?

У меня есть класс, подобный этому:

[DataContract]
public class ForwardCurve
{
    [DataMember(Order=1, IsRequired = true)]
    public string Commodity { get; set; }

    [DataMember(Order = 2, IsRequired = false)]
    public IDictionary<string, int> DictValue { get; set; }

    [DataMember(Order = 3, IsRequired = false)]
    public IList<string> ListValue { get; set; }

}

Сгенерированный файл .proto с использованием Serializer.GetProto будет:

message ForwardCurve {
   required string Commodity = 1;
   repeated Pair_String_Int32 DictValue = 2;
   repeated string ListValue = 3;
}

Так что же такое Pair_String_Int32 (и что входит в поток байтов protobuffer) и есть ли способ отобразить это так, чтобы protobuf с помощью protoc мог создать эквивалентный код отображения в Java?

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Чтобы получить это для работы, добавьте новое сообщение в сгенерированный файл .proto, который выглядит следующим образом.

message Pair_String_Int32 {
 required string Key = 1;
 required int32 Value = 2;    
}

Затем protoc сможет создать соответствующий код для Java.

1 голос
/ 06 октября 2010

Я могу проверить позже (сейчас я на iPod), но я считаю, что это просто «повторный» набор фиктивного типа с members key = 1 value = 2 (с использованием типов по умолчанию для каждого - так c #строка отображается в прото строку и т. д.).Я нахожусь в процессе повторной реализации GetProto для v2, поэтому я постараюсь убедиться, что эти фиктивные типы включены в вывод.

...