protobuf 不支持泛型?

162 天前
 ljzxloaf

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

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

public class Response<T>  {

    @NotNull
    private ResponseStatus status;

    private T result;

 }
5145 次点击
所在节点    程序员
59 条回复
a33291
162 天前
是的,非常恶心
也不支持继承
或者写 t4 生成😂
ljzxloaf
162 天前
@a33291 #1 写 t4 生成是啥意思
gam2046
162 天前
message {
bytes result = 1;
}

自己根据类型,将 result 解析成正确的类型。
sujin190
162 天前
proto 作为协议数据声明,支持范型意味着声明侵入编码和传输过程,本来就不合适。不支持才是合理的。否则人家 isser 说了使用 any 类型就好了啊
debuggerx
162 天前
谁叫好好的响应数据非要包一层呢
Rickkkkkkk
162 天前
用 string

支持泛型什么鬼,那和不支持泛型的语言怎么交互?
nonempty
162 天前
byte ?
ljzxloaf
162 天前
@sujin190 #4 怎么定义协议?泛型说白了也就是个 message ,只不过是个动态的 message 而已。而且我觉得最恶心的一点是他们不仅不愿意支持这功能,而且还不愿意接受外部设计,连提 pr 的机会都不给。
ljzxloaf
162 天前
@Rickkkkkkk #6 只是支持而已,你可以不用,也可以生成不含泛型的 sdk
ljzxloaf
162 天前
@debuggerx #5 我在工作中看到的响应体都是这样设计的,看下你们的设计?
Rickkkkkkk
162 天前
@ljzxloaf 我确实没想到在一个不支持泛型的语言里要怎么用这个协议。这复杂度值得吗?
ljzxloaf
162 天前
@Rickkkkkkk #11 没有泛型的语言直接去掉泛型就好了,泛型只是个语法糖
sujin190
162 天前
@ljzxloaf #8 协议只是约定,好比 protobuf 用 id 号指定字段,这个字段的类型只是双方约定信息,实际数据中不包含这个类型信息也不应该包含,你要加泛型就要在实际数据中包含类型信息,而这个类型实现过程各个语言支持不一样,已经产生了平台依赖,破坏了协议应该和实际实现无关的只是抽象约定的逻辑

如果你想说泛型类型信息也可以是双方约定,那么这和你申明类型是 any 然后任然需要另外一个字段在实际数据传输类型标记有何区别,如果你想说为何不可以把这个过程实现在基础库里,逻辑就是这个不符合基础库不应该包含非原子操作,好比 cpu 机器码不应该包含一个读取文件的高等级 api 一个逻辑,你想要你自己封装扩展就是了

不要把接口设计和程序逻辑混在一起,理解不到位也不要怪别人
Rickkkkkkk
162 天前
@ljzxloaf 去掉泛型,它的类型是什么?生成完的代码长啥样?而且这是藏逻辑,并不是好设计。
brightguo
162 天前
对,默认不支持。
我这边用的 golang ,我就把他改了,让 google.protobuf.Any 类型转换成了 interface{}。
你可以借鉴下( https://github.com/guoming0000/protobuf-go/commit/628f6211b3a75c96181c5137b1605fcfcedaaa4a ),然后改下 protobuf-java ,看看能不能满足你的需求。
不过这么改了就是非标了
wunonglin
162 天前
ljzxloaf
162 天前
@Rickkkkkkk #14 取舍问题,openapi 就支持了
debuggerx
162 天前
@ljzxloaf 很简单,正常响应直接返回数据,http 状态吗 200 ;接口出错时,前端参数问题就用 400 状态码,服务器问题就用 500 ,然后响应结构:{"code": 业务定义的错误码, "msg": 错误描述或希望显示的文案}

前端 api 设计形式类似 static fetchItemById = (id: number, onError: (code: number, msg: string) => void): Promise<Item | null> => {...}

直接根据 http 状态码去解析,而不是先解析,再根据状态搞泛型
ljzxloaf
162 天前
@wunonglin #16 没看懂,但是他这个问题不是加个 optional 就能进解决吗。。
eslizn
162 天前
这不是 oneof 的场景吗?

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

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

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

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

© 2021 V2EX