微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

您可以为重复的 Protobuf 消息中的一个字段分配多个不同的值类型吗?

如何解决您可以为重复的 Protobuf 消息中的一个字段分配多个不同的值类型吗?

我正在尝试对客户端进行逆向工程,该客户端将音频文件上传到服务器,然后在单独的请求中上传文件的元数据。元数据在 Protobuf 中被序列化,它使用了一个相当简单易读的结构。下面是 protoc --decode_raw 之后的样子:

1 {
  1: "title"
  2: "This is the audio title"
}
1 {
  1: "tags"
  2 {
  }
}
1 {
  1: "loc"
  2: "This is the location"
}
1 {
  1: "transcription"
  2: "A transcript"
}
1 {
  1: "mapping"
  2 {
    1 {
      1: 6
      2 {
        3: 840
      }
    }
    2: 6
  }
}

似乎只是字段1处的重复消息,每次都保存一个键值对,但有时值是字符串,有时是更复杂的消息。如果 Protobuf 只允许您为每个字段使用一种值类型,他们如何将字符串和消息分配给字段 2?如果我要制定自己的请求,我需要这样的东西:

message keyvaluePair {
    string key = 1;
    oneof value {
        string str_value = 2;
        MessageValue msg_value = 2;
    }
}

但这不起作用,因为 Field number 2 has already been used in "package.name" by field "str_value"。有任何想法吗?我将使用 Python 创建和发送请求数据。

解决方法

有一种官方方法可以实现这一点:google.protobuf.Any

如果 protobuf 模式在顶层定义了 any,例如:

message Root {
  repeated google.protobuf.Any value = 1;
}

message Title {
  string title= 2;
}

message Tags {
  string name = 1;
  repeated string tags = 2;
}

然后可以将任何 Protobuf 定义类型的消息序列化到列表中。

但是,我不认为现有代码正在这样做:

  • Any 的原始输出通常包括 type.googleapis.com 类型的网址
  • 使用 Any,title / loc 字段将封装在嵌套对象中,而不是同一级别的字符串中。

例如:

1 {
  1: "type.googleapis.com/Title"
  2 {
    1: "the title"
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。