一致的跨平台 Proto3 序列化/反序列化

我有一个用 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.Nameproto

func 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实施成功编码吗?

  • 还有什么可能导致这种不一致的价值观对待?


慕码人2483693
浏览 76回答 1
1回答

慕码人8056858

事实证明,这与配置错误无关,而是具体实施的问题。六天前,它已在porto-gen-ts v0.8.5 中修复感谢@Brits 的查找
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go