
假如现在返回的数据如下:
{ "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,还请各位大佬给点建议!
1 fcten 2017-12-15 17:17:41 +08:00 动态解析会影响性能,如果不需要考虑性能的话直接用 json 之类就行了…… |
3 vus520 2017-12-15 17:22:54 +08:00 静态语言动态解析 json 也没那么简单吧 |
4 sdrzlyz 2017-12-15 17:28:12 +08:00 protobuf 有 any 跟 oneof。。。 |
5 holyghost 2017-12-15 17:28:42 +08:00 要么 json,要么 https://avro.apache.org/ ,后者有类似于 pb 的版本升级要求。 |
6 binux 2017-12-15 17:29:50 +08:00 via Android 缺信息,解不了 |
8 fcten 2017-12-15 17:35:58 +08:00 @imherer 你没有明白我的意思,动态解析和 protobuf 设计的初衷不符,所以官方的 protobuf 库都不会支持动态解析的 当然,可以自己做……但是我觉得不如直接用 json |
10 binux 2017-12-15 17:54:44 +08:00 via Android protobuf 是向前兼容的啊,直接解析就好了啊。 虽然 nodejs 是动态语言,但是你为什么要用一个未定义的字段? |
11 fcten 2017-12-15 17:57:38 +08:00 @imherer 既然你解析的数据是 protobuf 格式,那么传给你数据的那一方不是肯定定义了.proto 文件吗,同步一下.proto 文件不就可以了,为什么还要自己写.proto 文件呢 |
12 L3ve 2017-12-15 18:00:13 +08:00 通讯结构应该一早就定好,该怎么样就怎么样,不应该有变化的可能性,要么就是数据结构定义的不好。 |
13 imherer OP @L3ve 嗯,理论上是这样的。 但是比如说某一个指令是获取用户背包里的数据的,背包里的数据以 json 的形式存在。不同的用户背包里的数据不一样,这样就牵涉到返回的数据格式有多有少。所以这里就在想能不能动态的解析和转化 |
14 wangxiaoer 2017-12-15 18:50:27 +08:00 via Android @imherer 背包数据种类也是有限的吧,全部以可选属性加上去不就行了? |
15 imherer OP @wangxiaoer 谢谢,刚用这个不知道有可选属性?我找找文档 |
16 MeteorCat 2017-12-15 19:27:41 +08:00 via Android 你需要的是'热更新'? |
18 billwsy 2017-12-15 19:33:55 +08:00 proto3 全部是可选,proto2 有 optional 关键字。一般情况下所有字段都应该是 optional 的,以上层约定是不是必选。 proto2 会写成这个样子: message TextMessage { optional int32 age = 1; optional string name = 2; // Required. } 另外 int32 写成 uint32 更好,如果你在 int32 里面存个-1 那会超级长的。用 uint32 的话可以用 has_age()来判断这个字段是不是存在。 |
20 bramblex 2017-12-15 23:11:31 +08:00 nodejs 还用什么 protobuf 嘛…… 我们 c 艹的不得不用 protobuf 没办法,你们 nodejs 用是找虐啊…… |
21 panlilu 2017-12-15 23:54:50 +08:00 nodejs 的 protobuf 坑很多,还会导致你 npm install 巨慢,建议谨慎使用。 |
22 jiangzhuo 2017-12-15 23:57:25 +08:00 对于 nodejs 来说动态解析静态解析性能差别不大 protobuf.js 是最好的了,没有之一,当然还有很多不足比如 OnceOf Any google.protobuf.中的 wellKnownType 不过都可以通过扩展 protobuf.js 轻松实现 |
23 pathbox 2017-12-16 10:13:40 +08:00 via iPhone protobuf 的初衷不是动态解析吧? |
24 wucancc 2017-12-16 11:15:33 +08:00 protobuf 的初衷应该是数据压缩吧,目前看是压缩率较高的一种方式。 有很多 JSON 与 protobuf 互转的 nodejs 库,可以直接使用。 |