问题标签 [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.
protocol-buffers - gRPC / Protobuf 接口版本控制
假设我们使用 gRCP/Protobuf 连接许多应用程序。这些应用程序是由他们自己的团队以自己的速度开发和发布的。随着时间的推移,同一应用程序(例如安装在用户 PC 上的桌面应用程序)将在定义的界面上使用不同版本的不同版本。
虽然 Protobuf 旨在允许向后兼容,但有没有办法知道在不同点运行的接口版本是什么?
最简单的实现是让接口版本等于应用程序版本。但是由于使用了许多语言,在所有语言中实现应用程序版本控制并非易事。
那么版本接口如何让服务器知道客户端版本呢?我觉得服务器应该可以登录
来自 AppName v.version 的 DATETIME 连接 [使用接口 v.version]
protocol-buffers - protobuf 向后兼容性和 proto3 vs proto2
Protobuf 的卖点之一是向后兼容,即开发人员可以进化格式,老客户仍然可以使用它。
现在有了新的 Protobuf 版本,称为 proto3,IDL 语言本身不兼容,例如options
,required
丢弃的地方,enuns 的新语法,没有扩展。
这是否意味着使用 proto3 无法生成旧 proto2 也可以读取/理解的二进制文件?
这就好像你必须继续使用proto2。如果你开始使用 proto3,你就不能和旧系统对话,或者不得不重写、重新编译所有那些.proto
s,这首先是兼容性中断。
grpc - Protobuf 3 打破合约可加性
我在分布式环境(“微服务”)中使用 Protobuf 3 和 gRPC。
由于 Protobuf 3 中缺乏支持的未设置/缺失值,我遇到了以下与合同可加性相关的问题。
想象一下,我有服务 A以及Team B和Team C拥有的几个消费者服务B和C 。
如果我向服务 A 的合同添加一个字段,例如布尔值,首先它将具有默认值,该值将按原样写入数据库。
然后,团队 B更新他们的服务以使用更新的合同进行对话,并将“true”作为字段值传递。然后,团队 C仍然使用旧合同并调用相同的服务 - 值被替换为 false。但C队不是这个意思,而且他们根本不知道那个领域。
因此,服务 A 根本无法延长合同,因为由于各种原因没有更新的消费者仍然能够损害数据,而服务 A 对此无能为力。
在 Thrift 中,此类事情只需通过单次检查 ( .isSet()
) 即可完成。
有一些肮脏的解决方法,比如将原语包装到对象中,但它强制使用特定于库实现的按引用检查(至少在 java 中),这似乎比健壮的解决方案更糟糕。此外,最终,我必须将所有内容包装在包装器中,正如您想象的那样,这也不是很好的解决方案。
2017 年,您在 Protobuf 3 中使用哪些最佳实践来管理此类情况?您如何管理/协调团队/服务之间的合同更新?谢谢
注意:这个问题不完全是关于如何对未设置/缺失值实施不检测,而是关于如何忍受它并遵循 Protobuf 3 哲学。
protocol-buffers - 如何在 .proto 中将 json 作为有效负载传递
根据以下页面,我应该能够发送 json 有效负载:https ://developers.google.com/protocol-buffers/docs/proto3 在“JSON 映射”下。
我想将 json 有效负载作为消息的一部分发送,并且我有以下 .proto 文件:
但是编译它会给我以下错误:
我也尝试过'Struct',但我得到了同样的错误。
我误解了用法吗?如果我必须发送 json 有效负载,我是否作为字符串传入?
谢谢
android - 带有验证的单元测试 proto3 生成的对象
我正在使用proto3
Android 应用程序,但我遇到了对象相等问题,这使得测试非常困难,尤其是对于验证方法
这是代表问题的单元测试:
很明显,该方法equals
无法正常工作,检查生成的代码(附在底部)没有相等,生成哈希码。我可以assertThat
通过 using.toString
方法解决这个问题,但我找不到任何其他验证方式,例如。verify(anyMock).anyMethod(playerCards)
如果检查时不是非常小心,恐怕这也可能会影响我的运行时间。
- 有没有办法生成
equals
,hashcode
? - 如果没有,我至少可以扩展、覆盖
verify
以便toString
在检查原始生成的对象时使用吗?
代码片段:
我的原型文件是:
我通过gradle build生成文件并使用以下属性
生成的输出:
java - proto 编译器生成的 Java 类无法构建
我有一个简单的 .proto 文件,我从中生成 java 类。proto 文件如下所示。
错误是:
我正在使用3.1.0
生成类并构建 java 源代码。我是否有错误配置,proto 文件不正确还是 proto 中的错误?
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
而第二个没有。是否符合标准?
java - protobuf3 JsonFormat InvalidProtocolBufferException 无法识别的字符
我正在尝试将 json 转换为原始消息对象,但是如果 json 中有一些字符,例如 $ 或 . 或 _ 我得到一个 InvalidProtocolBufferException。我的原型:
Java代码:
输出:
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 代码。
protocol-buffers - 如何将 rpc 标记为已弃用
如果我有这样的服务:
我将如何标记GetThings
为已弃用?
我知道如何将字段或消息标记为已弃用,但我找不到任何有关 RPC 的信息。
这是针对 proto3 的。