踩到 Protobuf 解析坑了,如何才能严格解析 Protobuf?

查看 182|回复 10
作者:tool2d   
解析是指 protobuf 二进制文件。这协议和 json 不一样,数据类型并不是 1 对 1 的。
比如一个 Length-delimited 类型,int 是 2 ,同时对应多个子类型。可以是嵌入式 messages ,可以是 utf8 文本字符串,也可以是纯 bytes 数组。
现在写了一个解析器,是什么类型,要纯粹靠猜。先尝试 utf8 ,不行再退回到嵌入式 messages ,解析一次。如果还是不行,就默认为 bytes 数组。
总觉得很不靠谱的样子,在没有 proto 辅助的前提下,如何才能优雅的转为 json?

proto, 解析, bytes, JSON

AoEiuV020JP   
在用 protobuf ,这玩意儿难道不是自动生成序列化和反序列化代码然后再也不改的?
还是你解析的是别人的 protobuf 消息不知道真实格式?这当然只能猜了,多整点数据排除所有错误答案才能得出结果,
tool2d
OP
  
@AoEiuV020JP 我在用微软 ai 推理模型,用的是 protobuf 格式。
pb 本身是序列化格式没错,但是大部分模型推导的结构都比较松散,而且 onnx 里面的 layers 复杂度比较高。会夹杂各种没遇到过的 operators 。用库不太方便,一些 OP 会变。
复杂度一高,代码就会变复杂。就希望能写一个稍微通用一点的转换工具了,化简 AI 推导流程。
stamhe   
proto 本身就会定义数据类型啊。。。还有不知道的?
tool2d
OP
  
@stamhe AI 模型和通讯协议不一样,并没有 proto 文本数据。
就只给一个模型 pb 二进制文件,我要反推内部的输入参数,把 input/output 对接上才行。
每个模型权重输入,每个版本都不太一样。
pkoukk   
我以为你在吐槽隔壁那个帖子,没想到你是认真的
thinkershare   
@tool2d proto 不是自包含和自解释协议,因此你的想法不对。
tool2d
OP
  
@thinkershare 这个开源工具可以解析任意 proto 生成的二进制文件,不需要原始格式
https://protobuf-decoder.netlify.app/
这工具用起来没问题,但是我去看源代码实现方式,核心功能是依靠 try catch 实现的,说白了就是靠猜,这就很尴尬了。
sujin190   
预定义格式不是自解析的不靠猜靠啥,不知道你在无厘头吐槽啥
thinkershare   
@tool2d protobuf 的官网已经明确说明,没有 proto 的原始定义下,如果要实现子描述,你需要自己实现。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部