首页 文章

protobuf-net - 反引号,词典和.proto文件

提问于
浏览
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#发送和接收这些protobufs一切正常,只是当我们将iphone添加到混合中时,这就成了一个问题 . )

UPDATE :感谢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 回答

  • 1

    首先 - 您是否尝试在iPhone上使用protobuf-net? v1预计不会通过monotouch工作; v2 does work(这是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,则根本不需要"proto";只是兼容的类型 .

相关问题