我正在尝试与使用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#发送和接收这些protobufs一切正常,只是当我们将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;
答案 0 :(得分:1)
首先 - 您是否尝试在iPhone上使用protobuf-net ? v1预计不会通过monotouch工作; v2 确实工作(这是v2工作的一个重要驱动因素),但尚未发布(目前可用但不完整)。如果您正在尝试这样做,请告诉我,因为它很重要;-p
我希望他们通过调用Serializer.GetProto<T>
来获取.proto,遗憾的是这不是万无一失的,尤其是在涉及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
}
但是,请注意,如果使用.NET-to-.NET,则根本不需要 ;只是兼容的类型。