我正在尝试对客户端进行逆向工程,该客户端将音频文件上传到服务器,然后在单独的请求中上传文件的元数据。元数据在 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
每次保存一个键值对,但有时该值是一个字符串,有时它是一个更复杂的消息。他们如何将字符串和消息分配给字段2
如果 Protobuf 只允许每个字段使用一种值类型?如果我要制作自己的请求,我需要这样的东西:
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 https://developers.google.com/protocol-buffers/docs/reference/python-generated#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 定义类型的消息都可以在列表中序列化。
然而,我不think这就是现有代码正在做的事情:
- 原始输出为
Any
通常包括type.googleapis.com
输入网址
- Using
Any
, title / loc 字段将封装在嵌套对象中,而不是同一级别的字符串中。
E.g.:
1 {
1: "type.googleapis.com/Title"
2 {
1: "the title"
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)