Protobuf-net 对 Dictionary/KeyValuePair 的支持如何工作?

Posted

技术标签:

【中文标题】Protobuf-net 对 Dictionary/KeyValuePair 的支持如何工作?【英文标题】:How does Protobuf-net support for Dictionary/KeyValuePair works? 【发布时间】:2010-10-06 15:13:57 【问题描述】:

我正在尝试了解 protobuf-net 的 Dictionary/KeyValuePair 支持。我们想使用底层二进制流和从 java 生成的 proto 文件,但是生成的 .proto 文件包含看起来像自定义类型的东西,称为 Pair_String_Int32。

有人可以解释一下吗?

我有一个像这样映射的类:

[DataContract]
public class ForwardCurve

    [DataMember(Order=1, IsRequired = true)]
    public string Commodity  get; set; 

    [DataMember(Order = 2, IsRequired = false)]
    public IDictionary<string, int> DictValue  get; set; 

    [DataMember(Order = 3, IsRequired = false)]
    public IList<string> ListValue  get; set; 


使用 Serializer.GetProto 生成的 .proto 文件将是:

message ForwardCurve 
   required string Commodity = 1;
   repeated Pair_String_Int32 DictValue = 2;
   repeated string ListValue = 3;

那么什么是 Pair_String_Int32(以及进入 protobuffer 字节流的内容),有什么方法可以映射它,以便 protobuf 通过使用 protoc 可以在 Java 中创建等效的映射代码?

【问题讨论】:

【参考方案1】:

要让这个工作起来,在生成的 .proto 文件中添加一条新消息,如下所示。

message Pair_String_Int32 
 required string Key = 1;
 required int32 Value = 2;    

那么protoc就可以为Java创建相应的代码了。

【讨论】:

【参考方案2】:

我可以稍后检查(我现在在 iPod 上),但我相信它只是一个“重复”的一组虚拟类型,成员 key=1 value=2(使用每个默认类型 - 所以 c#字符串映射到原始字符串等)。我正在为 v2 重新实现 GetProto,所以我会尽量确保这些虚拟类型包含在输出中。

【讨论】:

我通过在生成的 .proto 文件中添加一条额外的消息来完成这项工作。如果 GetProto 生成更完整,那就太棒了。

以上是关于Protobuf-net 对 Dictionary/KeyValuePair 的支持如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

protobuf-net 的 [ProtoInclude(1, "MyClass")] 不起作用

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

Protobuf-net 对字节数组进行序列化/反序列化

对 protobuf-net WCF 的使用感到困惑

使用带有 protobuf-net 异常的代理对 List<T> 进行序列化

是否可以在 Silverlight 中使用 protobuf-net 对私有属性进行(反)序列化?