protobuf-net - обратные ссылки, словари и файлы .proto - PullRequest
1 голос
/ 29 марта 2010

Я пытаюсь поговорить с программой на C #, которая использует protobuf-net с iphone, используя http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers

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

repeated Pair_Guid_List`1 Local = 6;

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

Используемая версия protobuf-net: r278.zip.

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

ОБНОВЛЕНИЕ : теперь все работает благодаря Марку!

Объект на стороне 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 Ответ

1 голос
/ 29 марта 2010

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

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

Хорошей новостью является то, что он моделирует 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; только совместимые типы.

...