protobuf-net - 反引号、字典和 .proto 文件

Posted

技术标签:

【中文标题】protobuf-net - 反引号、字典和 .proto 文件【英文标题】:protobuf-net - backticks, Dictionaries & .proto files 【发布时间】:2010-03-29 04:37:39 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

我希望他们已经通过调用 Serializer.GetProto&lt;T&gt; 获得了那个 .proto,不幸的是,这并不是万无一失的,尤其是当涉及到像 Dictionary&lt;,&gt; 这样的事情时(我将添加一个 TODO 来尝试在 v2 中修复它) .

好消息是它将Dictionary&lt;TKey,TValue&gt; 建模为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”;只是兼容的类型。

【讨论】:

感谢您的回答马克!我在 iphone 上使用 code.google.com/p/metasyntactic/wiki/ProtocolBuffers - 这会从 .proto 文件生成本机 Objective C 代码。他们确实在使用 Serializer.GetProto。感谢您对建模的描述 - 我将尝试这样定义消息。 只是说,我确实让这一切正常工作。 C#端的对象竟然是:[ProtoMember(7)] public Dictionary> ReceivedPages get;放;在 .proto 中使用以下内容运行良好: message PagesDict required bcl.Guid guid = 1;重复的 Pages Pages = 2; 重复 PagesDict ReceivedPages = 6;

以上是关于protobuf-net - 反引号、字典和 .proto 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 ProtoBuf-net 反序列化派生类型(字典)未正确设置对象字段

了解 Protobuf-net 属性的序列化和反序列化

我可以使用 protobuf-net 在 Mono 中序列化一个对象(包含成员:​​字典、列表...等)并在 MS.NET 中反序列化它,反之亦然?

C# Protobuf-net:小数字典:零不能正确往返

意外的 protobuf-net 序列化程序行为

protobuf-net 可以用来(反)序列化包含异构对象的列表吗?