protobuf 不支持泛型?

211 天前
 ljzxloaf

有人提 proposal 被拒了: https://github.com/protocolbuffers/protobuf/issues/9527#issue-1142821422

那像这种情况怎么搞?每个 response 都创建一个 wrapper ?

public class Response<T>  {

    @NotNull
    private ResponseStatus status;

    private T result;

 }
5393 次点击
所在节点    程序员
59 条回复
ljzxloaf
211 天前
@debuggerx #18 这只适用于 http 接口,而且即使是 http 接口,我也认为这样并不好,把业务状态放在协议里了
ljzxloaf
211 天前
@brightguo #15 搞不了搞不了...没那个能力...我还是老老实实多写几个 wrapper 吧
debuggerx
211 天前
@ljzxloaf 并非只适用 http ,而是一种设计思路,websocket 、mqtt 也都可以用类似的设计。而且这并不是什么把业务状态放在协议里,http 协议的状态码本就希望服务器能够表达一些明确的意图,不管成功失败全用 200 才是自作聪明的反设计,曾经可能还有些场景有些理由这样做,现在可以扔掉这种惯性设计了。
lesismal
211 天前
> 而且我觉得最恶心的一点是他们不仅不愿意支持这功能,而且还不愿意接受外部设计,连提 pr 的机会都不给。

别人合理拒绝,却反过来说别人封闭,什么道理!
要都是随便接受外部设计和 pr ,各种项目早都得被乌合之众搞凉了!
iyaozhen
211 天前
protobuf 肯定不要支持泛型呀
它一个二进制格式描述协议,和泛型有毛关系

你 pb idl 怎么写的,贴一下呢。就是需要 Response1 、Response2 一个个描述
如果你想 result 一会儿是这个 一会儿是那个,那这个场景就不适合用 pb 。直接裸写就行了,然后用 Swagger 的 Inheritance and Polymorphism 能力
ljzxloaf
211 天前
@lesismal #24 好吧,我表达的有问题,不是说随便接受 pr 。开源项目的一大优势不就是可以倾听社区的声音吗?我意思是没必要这样毫无余地的就拒绝,如果社区呼声很高,也是可以考虑的吧。
ljzxloaf
211 天前
@debuggerx #23 像“余额不足”这种业务情况如何用 status 表达,不还是得用自定义的 code 和 message
Rickkkkkkk
211 天前
@ljzxloaf 说到取舍,与其用泛型,这里最好的设计就是字段是 string 。这个取舍稍微想想就能选对了。
debuggerx
211 天前
@ljzxloaf http 状态码 500 ,返回数据类似{"code": 610016, "msg": "余额不足"}
简单来说就是成功时 http 状态 200 ,响应数据直接是业务负载数据,错误时 http 状态非 200 ,然后响应数据返回业务错误码和信息文本
Trim21
211 天前
@debuggerx 是具体是哪个 4xx 可能还可需要讨论,但肯定不该是 http 500 ...
moudy
211 天前
@ljzxloaf #9 问题就在这"可“字上。项目集成,维护,切换组件过程中麻烦事就够多了。

好比别人 boolean 都是 true false, 你的项目为了灵活定义 boolean 可以是 true false ""。代码都是 python 写的毫无问题,跟 js 交互也没问题。现在要跟 java 交互,项目组肯定日常问候。
guanzhangzhang
211 天前
pb 这种就是不支持泛型的,就像 http 里一个接口返回的 json 内容里有个 list 的值可能为
[1,2,3,4]和["1","2","3"]的,你序列化难道不是要 case int 和 string 吗,这样叫泛型吗,泛型是编译推导代码内的类型后去做类型擦除的。
可以是任意类型的话那应该用 json rpc 啥的有个 id 和 id 对应 data body 之类的,以及使用一个 websocket 传输不一样数据结构的 socketio 协议。
你应该考虑用 oneof 或者 message id | message body 这种。或者把那段类型指定为 byte ,自己序列化
wolfie
211 天前
很正常的需求,不用怀疑自己。
写过一些组件就懂泛型的意义了。
InkStone
211 天前
@ljzxloaf 它下面不是已经说理由了么,因为泛型太复杂了。如果要做泛型,那你需要做的不只是设计一套泛型语法,写一个看起来可行的实现,而是评估泛型在每一种 pb 可能交互的主流语言中使用会出现什么问题,在实现中解决这些问题,并给出一个健壮的测试集。又不是说你随便提个 PR 别人就必须得合的……
flyqie
211 天前
pb 不是有个类似于泛型的东西吗。

会在输出的时候额外加 type 来做标识。

我记错了?
flyqie
211 天前
@wolfie #33

有意义确实不假,但问题是太过于复杂了。

pb 最开始走的那个以 codegen 为主的模式做泛型会很麻烦。
jim9606
211 天前
把泛型这个需要语言特性支持的东西放进 IDL 就不合适,给不支持泛型的语言 codegen 带来一堆麻烦。
any 或者 oneof 然后自己 cast 就好懂多了。
楼上提到几个魔改也只是特定语言 codegen 小改,没动 IDL 。
hyperbin
210 天前
protobuf 的库是跨语言,那么那些不支持泛型的语言该如何适配?
fffq
210 天前
pb.Any 然后自己玩
5261
210 天前
我其实也在想 pb 的优势到底是啥? 除了跨语言外,还有就是同样的内容可能字节大小变小,但是现在流量不是过剩的情况下,json 不是也都满足嘛?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1120994

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX