2010-10-06 2 views
4

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

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

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

[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

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

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

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

1

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

+0

Я получил эту работу, добавив дополнительное сообщение в сгенерированный файл .proto. Это будет фантастически, если генерация GetProto будет более полной. –