imherer
V2EX  ›  Node.js

nodejs 能动态解析 protobuf 么?

  •  
  •   imherer · Dec 15, 2017 · 5278 views
    This topic created in 3079 days ago, the information mentioned may be changed or developed.

    使用 protobuf 的时候必须得先把.proto 文件定义好,但是很多时候需要解析的数据内容是不确定的,能动态解析么?

    解析库用的是 protobuf.js

    或者有更适合的库?

    Supplement 1  ·  Dec 15, 2017

    假如现在返回的数据如下:

    {
    	"id": 101,
    	"name": "test101"
    }
    

    那么我.proto就会定义成如下格式:

    message textMessage {
        int32 age = 1;
        string name = 2;   
    }
    

    假如某个时候返回的数据变成了如下格式:

    {
    	"id": 101,
    	"name": "test101",
    	"age": 18
    }
    

    那么这个时候.proto就应该变成如下格式:

    message textMessage {
        int32 id = 1;
        string name = 2;
        int32 age = 3;   
    }
    

    这只是简单的情况,复杂的可能还有json嵌套什么的

    初次使用protobuf,还请各位大佬给点建议!

    Supplement 2  ·  Dec 15, 2017
    不好意思,第一个.proto 里的 age 应该是 id 才对,写错了
    24 replies    2017-12-16 11:15:33 +08:00
    fcten
        1
    fcten  
       Dec 15, 2017
    动态解析会影响性能,如果不需要考虑性能的话直接用 json 之类的就行了……
    imherer
        2
    imherer  
    OP
       Dec 15, 2017
    @fcten 谢谢。 先说说如何动态解析呢?
    vus520
        3
    vus520  
       Dec 15, 2017
    静态语言动态解析 json 也没那么简单吧
    sdrzlyz
        4
    sdrzlyz  
       Dec 15, 2017
    protobuf 有 any 跟 oneof。。。
    holyghost
        5
    holyghost  
       Dec 15, 2017
    要么 json,要么 https://avro.apache.org/ ,后者有类似于 pb 的版本升级要求。
    binux
        6
    binux  
       Dec 15, 2017 via Android
    缺信息,解不了
    imherer
        7
    imherer  
    OP
       Dec 15, 2017
    @vus520
    @sdrzlyz
    @holyghost
    @binux
    append 了下,麻烦再看看,谢谢!
    fcten
        8
    fcten  
       Dec 15, 2017
    @imherer 你没有明白我的意思,动态解析和 protobuf 设计的初衷不符,所以官方的 protobuf 库都不会支持动态解析的
    当然,可以自己做……但是我觉得不如直接用 json
    imherer
        9
    imherer  
    OP
       Dec 15, 2017
    @fcten 嗯,大多数情况下确实先要定义好.proto,但是实际开发中还是有极个别会动态的来使用
    binux
        10
    binux  
       Dec 15, 2017 via Android
    protobuf 是向前兼容的啊,直接解析就好了啊。
    虽然 nodejs 是动态语言,但是你为什么要用一个未定义的字段?
    fcten
        11
    fcten  
       Dec 15, 2017
    @imherer 既然你解析的数据是 protobuf 格式,那么传给你数据的那一方不是肯定定义了.proto 文件吗,同步一下.proto 文件不就可以了,为什么还要自己写.proto 文件呢
    L3ve
        12
    L3ve  
       Dec 15, 2017
    通讯结构应该一早就定好,该怎么样就怎么样,不应该有变化的可能性,要么就是数据结构定义的不好。
    imherer
        13
    imherer  
    OP
       Dec 15, 2017
    @L3ve 嗯,理论上是这样的。 但是比如说某一个指令是获取用户背包里的数据的,背包里的数据以 json 的形式存在。不同的用户背包里的数据不一样,这样就牵涉到返回的数据格式有多有少。所以这里就在想能不能动态的解析和转化
    wangxiaoer
        14
    wangxiaoer  
       Dec 15, 2017 via Android
    @imherer 背包数据种类也是有限的吧,全部以可选属性加上去不就行了?
    imherer
        15
    imherer  
    OP
       Dec 15, 2017
    @wangxiaoer 谢谢,刚用这个不知道有可选属性?我找找文档
    MeteorCat
        16
    MeteorCat  
       Dec 15, 2017 via Android
    你需要的是'热更新'?
    imherer
        17
    imherer  
    OP
       Dec 15, 2017
    @MeteorCat 不是的,就是数据格式不是很确定
    billwsy
        18
    billwsy  
       Dec 15, 2017   ❤️ 1
    proto3 全部是可选,proto2 有 optional 关键字。一般情况下所有字段都应该是 optional 的,以上层约定是不是必选。

    proto2 会写成这个样子:
    message TextMessage {
    optional int32 age = 1;
    optional string name = 2; // Required.
    }

    另外 int32 写成 uint32 更好,如果你在 int32 里面存个-1 那会超级长的。用 uint32 的话可以用 has_age()来判断这个字段是不是存在。
    janxin
        19
    janxin  
       Dec 15, 2017 via iPhone
    @imherer 这个是协议设计不合理问题
    bramblex
        20
    bramblex  
       Dec 15, 2017
    nodejs 还用什么 protobuf 嘛……

    我们 c 艹的不得不用 protobuf 没办法,你们 nodejs 用是找虐啊……
    panlilu
        21
    panlilu  
       Dec 15, 2017
    nodejs 的 protobuf 坑很多,还会导致你 npm install 巨慢,建议谨慎使用。
    jiangzhuo
        22
    jiangzhuo  
       Dec 15, 2017
    对于 nodejs 来说动态解析静态解析性能差别不大
    protobuf.js 是最好的了,没有之一,当然还有很多不足比如 OnceOf Any google.protobuf.中的 wellKnownType 不过都可以通过扩展 protobuf.js 轻松实现
    pathbox
        23
    pathbox  
       Dec 16, 2017 via iPhone
    protobuf 的初衷不是动态解析吧?
    wucancc
        24
    wucancc  
       Dec 16, 2017
    protobuf 的初衷应该是数据压缩吧,目前看是压缩率较高的一种方式。
    有很多 JSON 与 protobuf 互转的 nodejs 库,可以直接使用。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1183 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 118ms · UTC 23:18 · PVG 07:18 · LAX 16:18 · JFK 19:18
    ♥ Do have faith in what you're doing.