2010-03-29 2 views
1

Я пытаюсь поговорить с программой # C, которая использует Protobuf-сеть из Iphone с помощью http://code.google.com/p/metasyntactic/wiki/ProtocolBuffersProtobuf-сеть - кавычка, Словари и .proto файлы

К сожалению файла .proto я дал (генерируемую из # исходного кода C) включает в себя линию, которая protoc отвергает:

repeated Pair_Guid_List`1 Local = 6; 

Вероятно, это происходит потому, что источником данных является C# словарь, с помощью ключа Guid и класса в качестве значения. Есть ли способ справиться с этим лучше?

Версия протобуф-сети в использовании - r278.zip.

(C# для отправки и получения этих protobufs все работает нормально, это просто, когда мы добавим Iphone в смесь, что это становится проблемой.)

UPDATE: все работает теперь благодаря Марк!

Объект на стороне C# оказался:

[ProtoMember(7)] 
public Dictionary<Guid, List<Pages>> ReceivedPages { get; set; } 

, которые прекрасно работали с использованием следующих в .proto:

message PagesDict { 
    required bcl.Guid guid = 1; 
    repeated Pages Pages = 2; 
} 

с сообщением о котором идет речь, содержащая:

repeated PagesDict ReceivedPages = 7; 

ответ

1

Во-первых - вы пытаетесь использовать protobuf-net на iPhone? Ожидается, что v1 не будет работать через monotouch; v2 делает работы (это был большой драйвер для работы v2), но еще не выпущен (он может быть использован, но неполный на данный момент). Дайте мне знать, если вы пытаетесь это сделать, поскольку это имеет значение; -p

Я ожидаю, что они получили это .proto, вызвав Serializer.GetProto<T>, что, к сожалению, не является безупречным, особенно когда такие вещи, как Dictionary<,> (Я добавлю TODO, чтобы попытаться исправить это в версии 2).

Хорошая новость заключается в том, что она моделирует Dictionary<TKey,TValue>, как repeated someType, где someType должно быть:

message someType { 
    required keyType key = 1; 
    required valueType value = 2; 
} 

И Guid моделируется как bcl.Guid (bcl.proto), который:

message Guid { 
    optional fixed64 lo = 1; // the first 8 bytes of the guid 
    optional fixed64 hi = 2; // the second 8 bytes of the guid 
} 

Примечание , однако, что «proto» не требуется вообще при работе .NET-to-.NET; просто совместимые типы.

+0

Спасибо за ваш ответ. Марк! Я использую http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers на iphone - это генерирует собственный код Objective C из файла .proto. Они действительно используют Serializer.GetProto . Благодарим вас за описание моделирования. Я попытаюсь определить такое сообщение. – JosephH

+0

Просто сказать, что я все это работаю. Объект на стороне C# оказался [ProtoMember (7)] Публичный словарь > Полученные документы {get; задавать; } , который работал нормально, используя следующее в .proto: message PagesDict { required bcl.Guid guid = 1; повторяющиеся Страницы Страницы = 2; } repeat PagesDict ReceivedPages = 6; – JosephH

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