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<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”;只是兼容的类型。
【讨论】:
感谢您的回答马克!我在 iphone 上使用 code.google.com/p/metasyntactic/wiki/ProtocolBuffers - 这会从 .proto 文件生成本机 Objective C 代码。他们确实在使用 Serializer.GetProto以上是关于protobuf-net - 反引号、字典和 .proto 文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 ProtoBuf-net 反序列化派生类型(字典)未正确设置对象字段
我可以使用 protobuf-net 在 Mono 中序列化一个对象(包含成员:字典、列表...等)并在 MS.NET 中反序列化它,反之亦然?