问题标签 [proto3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
11032 浏览

protocol-buffers - gRPC / Protobuf 接口版本控制

假设我们使用 gRCP/Protobuf 连接许多应用程序。这些应用程序是由他们自己的团队以自己的速度开发和发布的。随着时间的推移,同一应用程序(例如安装在用户 PC 上的桌面应用程序)将在定义的界面上使用不同版本的不同版本。

虽然 Protobuf 旨在允许向后兼容,但有没有办法知道在不同点运行的接口版本是什么?

最简单的实现是让接口版本等于应用程序版本。但是由于使用了许多语言,在所有语言中实现应用程序版本控制并非易事。

那么版本接口如何让服务器知道客户端版本呢?我觉得服务器应该可以登录

来自 AppName v.version 的 DATETIME 连接 [使用接口 v.version]

0 投票
1 回答
9219 浏览

protocol-buffers - protobuf 向后兼容性和 proto3 vs proto2

Protobuf 的卖点之一是向后兼容,即开发人员可以进化格式,老客户仍然可以使用它。

现在有了新的 Protobuf 版本,称为 proto3,IDL 语言本身不兼容,例如optionsrequired丢弃的地方,enuns 的新语法,没有扩展。

这是否意味着使用 proto3 无法生成旧 proto2 也可以读取/理解的二进制文件?

这就好像你必须继续使用proto2。如果你开始使用 proto3,你就不能和旧系统对话,或者不得不重写、重新编译所有那些.protos,这首先是兼容性中断。

0 投票
2 回答
281 浏览

grpc - Protobuf 3 打破合约可加性

我在分布式环境(“微服务”)中使用 Protobuf 3 和 gRPC。

由于 Protobuf 3 中缺乏支持的未设置/缺失值,我遇到了以下与合同可加性相关的问题。

想象一下,我有服务 A以及Team BTeam C拥有的几个消费者服务B和C 。

如果我向服务 A 的合同添加一个字段,例如布尔值,首先它将具有默认值,该值将按原样写入数据库。

然后,团队 B更新他们的服务以使用更新的合同进行对话,并将“true”作为字段值传递。然后,团队 C仍然使用旧合同并调用相同的服务 - 值被替换为 false。C队不是这个意思,而且他们根本不知道那个领域。

因此,服务 A 根本无法延长合同,因为由于各种原因没有更新的消费者仍然能够损害数据,而服务 A 对此无能为力。

在 Thrift 中,此类事情只需通过单次检查 ( .isSet()) 即可完成。

有一些肮脏的解决方法,比如将原语包装到对象中,但它强制使用特定于库实现的按引用检查(至少在 java 中),这似乎比健壮的解决方案更糟糕。此外,最终,我必须将所有内容包装在包装器中,正如您想象的那样,这也不是很好的解决方案。

2017 年,您在 Protobuf 3 中使用哪些最佳实践来管理此类情况?您如何管理/协调团队/服务之间的合同更新?谢谢

注意:这个问题不完全是关于如何对未设置/缺失值实施不检测,而是关于如何忍受它并遵循 Protobuf 3 哲学

0 投票
5 回答
5318 浏览

protocol-buffers - 如何在 .proto 中将 json 作为有效负载传递

根据以下页面,我应该能够发送 json 有效负载:https ://developers.google.com/protocol-buffers/docs/proto3 在“JSON 映射”下。

我想将 json 有效负载作为消息的一部分发送,并且我有以下 .proto 文件:

但是编译它会给我以下错误:

我也尝试过'Struct',但我得到了同样的错误。

我误解了用法吗?如果我必须发送 json 有效负载,我是否作为字符串传入?

谢谢

0 投票
1 回答
1663 浏览

android - 带有验证的单元测试 proto3 生成的对象

我正在使用proto3Android 应用程序,但我遇到了对象相等问题,这使得测试非常困难,尤其是对于验证方法

这是代表问题的单元测试:

很明显,该方法equals无法正常工作,检查生成的代码(附在底部)没有相等,生成哈希码。我可以assertThat通过 using.toString方法解决这个问题,但我找不到任何其他验证方式,例如。verify(anyMock).anyMethod(playerCards)

如果检查时不是非常小心,恐怕这也可能会影响我的运行时间。

  • 有没有办法生成equals, hashcode?
  • 如果没有,我至少可以扩展、覆盖verify以便toString在检查原始生成的对象时使用吗?

代码片段:

我的原型文件是:

我通过gradle build生成文件并使用以下属性

生成的输出

0 投票
0 回答
1019 浏览

java - proto 编译器生成的 Java 类无法构建

我有一个简单的 .proto 文件,我从中生成 java 类。proto 文件如下所示。

错误是:

我正在使用3.1.0生成类并构建 java 源代码。我是否有错误配置,proto 文件不正确还是 proto 中的错误?

0 投票
1 回答
143 浏览

grpc - gRPC 选项值中的分号是必需的、可选的还是不允许的?

我看到一段代码如下:

rpc SayFallback (FooRequest) returns (FooResponse) { option (com.example.proto.options.bar) = { value : "{ message:\"baz\" }"; }; }

另一个像下面这样:

rpc SayFallback (FooRequest) returns (FooResponse) { option (com.example.proto.options.bar) = { value : "{ message:\"baz\" }" }; }

第一个有一个;在线,value而第二个没有。是否符合标准?

0 投票
1 回答
3208 浏览

java - protobuf3 JsonFormat InvalidProtocolBufferException 无法识别的字符

我正在尝试将 json 转换为原始消息对象,但是如果 json 中有一些字符,例如 $ 或 . 或 _ 我得到一个 InvalidProtocolBufferException。我的原型:

Java代码:

输出:

0 投票
1 回答
691 浏览

ruby-on-rails - 如何定义 protobuf 消息以通过编译 protomsg 将活动记录 protobuf 消息直接作为输入参数传递到 ruby​​ grpc 代码中?

我们正在使用 proto3 创建一个 grpc 服务器。并将其编译为 ruby​​ 函数。我们使用 ActiveRecord-Protobuf gem 将 Active Record 消息转换为 protobuf 消息(通过调用“activerecord”.to_proto 方法获得)。然而,在创建 protobuf 消息以创建 ruby​​ 服务器时,我们无法传递“activerecord”.to_proto 消息,因为在定义输入值的类型时我们别无选择,只能将其定义为 proto3 中的消息,因此它只接受一个哈希值。为此,我们必须将 .to_proto 对象转换为“activerecord”.to_proto.to_hash。这是徒劳的,并且降低了 grpc 的最优性。具有讽刺意味的是,我们正在转向 grpc 以获得最优性。您能否建议如何定义 protobuf 消息(使用 proto3)以确保“活动记录”。

这是活动记录对象。

这被转换为 AppPreference.last.to_proto ,这是一个按类的 protobuf 消息。

我对 ruby​​ 输入参数的 protobuf 定义如下。

此参数“Index_Output”仅接受 AppPreference.last.to_proto.to_hash 但我希望它接受 AppPreference.last.to_proto 作为输入。我如何更改我的 protobuf 代码。

0 投票
1 回答
10887 浏览

protocol-buffers - 如何将 rpc 标记为已弃用

如果我有这样的服务:

我将如何标记GetThings为已弃用?

我知道如何将字段或消息标记为已弃用,但我找不到任何有关 RPC 的信息。

这是针对 proto3 的。