【问题标题】:How can unknown field functionality be replicated in proto3?如何在 proto3 中复制未知字段功能?
【发布时间】:2015-06-12 20:37:28
【问题描述】:

Google 已删除 proto3 中的未知字段。我很想听听这个选择背后的原因。另外,如果有人有任何方法可以复制 proto2 行为,我很想听听。

如果重要的话,我们正在用 Go 编写代码。

由于 proto3 和 grpc 是并行开发的,我也想接触 grpc 社区。​​p>

来源:Removal of unknown fields

【问题讨论】:

  • 这与您要“联系”谁无关。你在问一个关于协议缓冲区的问题。 gRPC 是另一回事。当然,它们是相关的,但您的问题不是关于 gRPC。
  • 他们好像没说什么。作为一种猜测,它可能会清理接口:gRPC just fills your structs 而 proto needs to give you a message to pass along (并且您需要实际传递它以保持您的应用程序未知字段安全)。他们可能认为让调用者和被调用者一起升级更安全,就像当一个 Go 方法添加一个参数时,它的调用者也需要更新一样。作为一种解决方法,也许您可​​以将 proto3 映射用于新字段。
  • 也许提供一个您使用“未知”字段的特定用例?
  • 如果 protobuf 消息存储在数据库中,并且具有旧版本 protobuf 消息类型的客户端需要进行修改,而不会破坏使用当前版本 protobuf 的客户端写入的字段。同时更新所有客户端以获得最新的 protobuf 消息版本是不可能的。此外,不同的客户端类型具有不同的更新计划,因此需要在多个代码库之间协调更改。
  • 当然,这会使发布工程变得更加困难,但这当然不是不可能的。使用内置的新 proto 定义首先发布所有组件就足够了,并且只有在下一个版本中才开始编写新字段。

标签: go protocol-buffers grpc proto3


【解决方案1】:

摆脱原语的字段存在使 Protobuf 在许多语言中更加“自然”和高效,因为 C/C++、Java、C# 和 Go 中的原语必须存在。在此类语言中,如果您想要存在信息,您可以通过将其设置为指向原语的指针来“装箱”原语。

Protobuf 3 摆脱了原语的存在,但仍然具有消息的存在。因此,您可以对 Protobuf 使用相同的“装箱”技术。 Protobuf 现在有standard messages that box primitives。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2021-01-09
    • 2013-03-26
    • 2012-12-14
    • 2019-05-22
    相关资源
    最近更新 更多