protobuf-net - backticks,Dictionaries& .proto文件

时间:2010-03-29 04:37:39

标签: c# iphone objective-c protocol-buffers protobuf-net

我正在尝试与使用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;

1 个答案:

答案 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,则根本不需要 ;只是兼容的类型。