我有一個用 proto3 定義的基于 golang 的 GRPC服務syntax = "proto3";對于單個 bool 字段的簡單響應,如果值為false整個消息,則將其序列化為空(零長度)數據有效負載。(正如我懷疑的那樣,將false其視為默認值)同時,根據完全相同的.proto定義構建的節點的 GRPC 客戶端將值解釋為undefined. (雖然true一個非常一致)調試服務器構建響應的方式data, err := encode(s.getCodec(stream.ContentSubtype()), msg)我注意到,stream.ContentSubtype()返回一個空字符串,以便在其中s.getCodec回落到. 它導致在這里進一步編碼一些東西encoding/proto.Nameprotofunc marshalAppend(buf []byte, m Message, deterministic bool) ([]byte, error) { if m == nil { return nil, ErrNil } mi := MessageV2(m) nbuf, err := protoV2.MarshalOptions{ Deterministic: deterministic, AllowPartial: true, }.MarshalAppend(buf, mi)這看起來像是真正protoV2的實施。所以我不知道這里真正正確的問題是什么應該stream.ContentSubtype()在通信級別上以某種方式控制以及誰負責(客戶端/服務器)在根據定義生成客戶端/服務器源代碼時是否應遵循任何其他控制步驟/操作.proto。它不會.proto自我概括元數據以輸出一致的來源嗎?/Cloudproto3真的應該通過protoV2實施成功編碼嗎?還有什么可能導致這種不一致的價值觀對待?
一致的跨平臺 Proto3 序列化/反序列化
慕碼人2483693
2023-01-03 14:20:58