V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lslvxy
V2EX  ›  问与答

ProtoBuf 解析 没有源 pb 文件

  •  
  •   lslvxy · 2021-09-15 15:28:48 +08:00 · 1194 次点击
    这是一个创建于 1199 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对接方给了个接口文档

    说明 类型 序号
    姓名 STRING 4
    性别 INT 5
    生日 STRING 7
    手机号码 STRING 8

    只有 pb 说明,没有源文件 我按照这个文档自己建一个 pb 文件可以么? 关机我不知道他们的 key 名字,只有中文说明 如果建的 key 不一样可以解析么

    message Request {
        string name = 4;
        int32 sex = 5;
        string birthday = 7;
        string phone = 8;
    }
    
    13 条回复    2021-09-16 17:24:13 +08:00
    TtTtTtT
        1
    TtTtTtT  
       2021-09-15 15:48:56 +08:00
    只有序号有用,名字叫啥只是跟你生成的代码有关,和传输的数据无关。
    Jokerrrrrr
        2
    Jokerrrrrr  
       2021-09-15 15:50:32 +08:00
    还有这样对接的嘛
    MegrezZhu
        3
    MegrezZhu  
       2021-09-15 15:56:14 +08:00
    大概可以用 Reflection 或者 Descriptor 强行搞?
    但为啥只给 pb 说明呢……
    virusdefender
        4
    virusdefender  
       2021-09-15 16:06:14 +08:00
    去要啊,可能就是忘了给了
    securityCoding
        5
    securityCoding  
       2021-09-15 16:15:59 +08:00
    通用的 ,v2/v3 试一下就可以
    lslvxy
        6
    lslvxy  
    OP
       2021-09-15 16:31:47 +08:00
    @TtTtTtT 我测试了下是只有序号有用的,接口文档给的太粗糙了,太难理解
    ![]( https://gitee.com/lslvxy/pics/raw/master/imgs/2021-09/20210915163128.png)
    这个怎么理解啊
    TtTtTtT
        7
    TtTtTtT  
       2021-09-15 16:35:25 +08:00
    @lslvxy 就是 byte[]再解析成下面那个对象。
    因为 protobuf 对于多态的支持有点弱,一般都是先转换成 ByteString,再塞到一个 bytes 的 field 里。
    lslvxy
        8
    lslvxy  
    OP
       2021-09-15 16:38:32 +08:00
    @TtTtTtT 那我 httpclient 调用 要先把下面的对象 build 之后 toByteArray()再塞到上面的 bytes 里面再 toByteArray()发出去么
    TtTtTtT
        9
    TtTtTtT  
       2021-09-15 16:42:18 +08:00
    @lslvxy 唔,是的。
    不过你如果是调用方的话,不考虑他们的那种多态设计,字段直接引用对象也是可以的。在 Protobuf 内部,bytes 和 message type 的类型是一样的。
    lslvxy
        10
    lslvxy  
    OP
       2021-09-15 16:50:33 +08:00
    @TtTtTtT 我这边用 httpclient 测试了发送二进制数据过去了,拿到了一个 response 二进制数组
    [120, -25, 122, 110, 80, 120, -41, -120, 113, 113, 113, 113, 113, 113, 113, 127, 110, 109, 14, 27, 13, 0, 1, 2, 13, 27, 80, 7, 13, 80, 2, 11, 4, 4, 95, 95, 95]

    解析出来 是� ��������� response is null!!! 前面一串是乱码,后面一部分是正常的
    业务 response 二级结构:
    说明 类型 序号
    返回码 INT 1
    返回内容 STRING 2
    TtTtTtT
        11
    TtTtTtT  
       2021-09-16 10:28:17 +08:00
    @lslvxy 不知道返回的是啥,解析了一下前面几个 Byte,到 110 就卡住了。
    int 1 对应的是 8,string 2 对应的是 18 。
    lslvxy
        12
    lslvxy  
    OP
       2021-09-16 13:45:12 +08:00
    @TtTtTtT 这个我解决好了,pb3 层嵌套的,文档太粗糙了,干
    sikong31
        13
    sikong31  
       2021-09-16 17:24:13 +08:00
    如果你是想知道其他序号什么类型 可以用这个 https://github.com/mildsunrise/protobuf-inspector 数据够多一般都能搞出来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   971 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:03 · PVG 06:03 · LAX 14:03 · JFK 17:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.