【问题标题】:Dictionary in protocol buffers协议缓冲区中的字典
【发布时间】:2011-05-10 20:08:37
【问题描述】:

有没有办法使用协议缓冲区来序列化字典,或者如果我需要,我必须使用 Thrift?

【问题讨论】:

标签: serialization protocol-buffers thrift


【解决方案1】:

Protobuf 规范现在 supports dictionaries (maps) natively.

原答案

人们通常将字典写成键值对列表,然后在另一端重建字典。

message Pair {
   string key = 1;
   string value = 2;
}

message Dictionary {
   repeated Pair pairs = 1;
}

【讨论】:

  • 有没有办法用动态类型做同样的事情?我有一个需要序列化的Dictionary<string,object>。 =/ 正在尝试调查协议缓冲区是否可以在不费力的情况下做到这一点。
  • 嗯,不。 Protobuf 不是通用的对象序列化协议。您需要为要序列化的所有数据定义 protobuf 消息。 (老实说,如果你有一个 映射,你可能应该从重构代码开始。)
  • @Mike 您必须为它可能的每种类型创建一个字段,这是一个等待发生的错误。
【解决方案2】:

我首先评论@Flassari 的答案,因为它真的很方便。

但是,就我而言,我需要map<Type, repeated AnyModel> where :

enum Type {
    Undefined = 0;
    Square = 1;
    Circle = 2;
}

message AnyModel {
    string Name = 1;
}

这里我只想返回一个字典,对于每种类型,都包含一个 AnyModel 列表

但是,我没有找到比@JesperE 提出的更好的解决方法,所以我做了以下操作:(as you can't use enum as key in map)

message MyRPCBodyCall {
    map<string, AnyModels> Models = 1;
}

enum Type {
    Undefined = 0;
    Square = 1;
    Circle = 2;
}

message AnyModel {
    string Name = 1;
}

message AnyModelArray {
    repeated AnyModel AnyModels = 1;
}

在这里,我从服务器/客户端使用我选择的代码语言从/到字符串我的枚举

因此,这两种方法实际上都是 IMO 的有效答案,具体取决于您的要求。

【讨论】:

    【解决方案3】:

    对于未来的答案寻求者,ProtoBuf now supports Maps 原生:

    message MapMessage
    {
        map<string, string> MyMap = 1;
    }
    

    【讨论】:

    【解决方案4】:

    您可以查看ProtoText 包。

    假设您要将字典 person_dict 序列化为在 personbuf_pb2 模块中定义的预定义 PersonBuf protobuf 对象。

    在这种情况下,要使用 ProtoText,

    import ProtoText
    from personbuf_pb2 import PersonBuf
    
    obj = PersonBuf()
    obj.update(person_dict)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2021-12-19
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 2016-12-19
      相关资源
      最近更新 更多