1

我正在尝试使用http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers与使用来自 iphone 的 protobuf-net 的 C# 程序交谈

不幸的是,我得到的 .proto 文件(从 C# 源代码生成)包含 protoc 拒绝的一行:

repeated Pair_Guid_List`1 Local = 6;

这似乎是因为源数据是一个 C# 字典,其中一个 Guid 键和一个类作为值。有没有办法更好地应对这种情况?

使用的 protobuf-net 版本是 r278.zip。

(C# 发送和接收这些 protobuf 都可以正常工作,只是当我们将 iphone 添加到组合中时,这成为一个问题。)

更新:感谢 Marc,现在一切正常!

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;
4

1 回答 1

1

首先 - 你想在 iPhone 上使用 protobuf-net?v1 预计不能通过单点触控工作;v2确实有效(这是 v2 工作的重要推动力),但尚未发布(目前可用但不完整)。如果您想这样做,请告诉我,因为这很重要;-p

我希望他们已经通过调用 .proto 获得了该 .proto Serializer.GetProto<T>,不幸的是,这并不是万无一失的,尤其是当Dictionary<,>涉及到诸如此类的事情时(我将添加一个 TODO 以尝试在 v2 中修复该问题)。

好消息是它建模Dictionary<TKey,TValue>repeated someTypesomeType应该在哪里:

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
}

但是请注意,如果使用 .NET-to-.NET,则根本不需要“proto” ;只是兼容的类型。

于 2010-03-29T05:13:44.163 回答