问题标签 [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 投票
2 回答
4155 浏览

size - 我可以为 protobuf 中的数字设置最大值吗?

在 protobuf 中,我们只能选择使用有符号或无符号 32 位或 64 位整数来限制值的范围。

但是,我要定义的数据结构包含 8 位、16 位和 32 位整数的混合,以节省嵌入式设备的空间。在它们上,数据结构的实现也有所不同,并且需要为某些字段保留特殊值,因此它们的最大数量不是 2 的幂。

在这些嵌入式设备上,protobuf 定义仅用于与它们之间的传输,而不用于实际存储。所以我可以在阅读它们时限制数字。

.proto但是,我宁愿在or文件中定义这些最大值,.options以确保所有客户端应用程序都知道这些限制。

有没有办法做到这一点?

我知道有字段选项,但此处列出的选项不包括此选项。可以创建自定义选项,但这似乎需要编写编译器扩展,这意味着我必须为我想要编译的每种语言手动实现此限制检查,这比它节省的时间要多。

0 投票
1 回答
655 浏览

protocol-buffers - 如何在 .proto 文件中将 com.google.protobuf.Message 定义为消息类型

如何在 proto 文件中定义通用消息。

例如:

而不是上面提到的协议,我需要以下协议。

我需要在. Foo_ 有没有办法做到这一点?BarBazresponse

0 投票
3 回答
2729 浏览

postgresql - 将 gorm.Model 字段集成到 protobuf 定义中

我试图弄清楚如何将 gorm.Model 字段(deleted_at、create_at、id 等)集成到我的 proto3 定义中。但是,我不能为 proto3 设置日期时间类型。我尝试寻找有关如何将 gorm 字段序列化为字符串的文档(因为 proto3 处理字符串),但我没有找到任何东西。

有没有人能够在他们的原型定义中成功使用 gorm 模型字段?我正在使用 go-micro 的插件来生成 *pb.go 文件。

这是我当前不起作用的消息定义。似乎空字符串存储在数据库中,因为当查询 deleted_at 为 null 时,postgres 数据库什么也不返回。

更新:我已将我的 proto def 更新为以下内容,但 gorm 仍未正确使用 Id、CreatedAt、UpdatedAt 和 DeletedAt 字段

0 投票
1 回答
4115 浏览

java - 编译 protobuf 以使用原始类而不是众所周知的类型

假设我有 test.proto 文件:

如果我将其编译(使用 protoc v3.5.0)为 c# 代码,我将获得可为空的类型属性:

但如果我将其编译为 Java 代码,字段将是众所周知的类型:

我正在将项目从 proto2 移动到 proto3,因此我想避免使用众所周知的类型,因为更改相关代码需要大量工作。对于 c# 项目,我不需要修改任何内容,但在 Java 中,我需要按照以下示例进行操作:

有没有办法将proto文件编译为 Java,以便设置器接受原始类/包装器(字符串、整数等)作为参数?

0 投票
1 回答
7045 浏览

javascript - 如何使用导入加载 proto 文件

我正在使用dcodeIO/protobuf.js库(版本 6.8.4)来解析浏览器中的 protobuf 消息。只要不导入另一个 proto 文件,我就可以使用简单的 proto 文件。

在主文件中导入其他 proto 文件会破坏一切。

这就是我所拥有的:

  • 文件结构

    /li>
  • messageA.proto

    /li>
  • messageB.proto

    /li>
  • 使用 6.8.4:

    /li>

.

  • 5.0:

    .

    /li>
0 投票
0 回答
379 浏览

c++ - 用于 protobuf 消息比较的 C 宏

我的目标是比较 protobuf 消息中的一些字段。我试过MessageDifferencer,但我不想使用反射。我正在使用 protobuf 3.4.0。

时间变量存储在 protobuf 众所周知的类型中,例如 google.protobuf.Duration 和 google.protobuf.Timestamp。

我想使用一个宏,它需要两个对象和一个字段名:

我期待以下结果:

我已经有一个简单类型的宏:

0 投票
2 回答
2027 浏览

protocol-buffers - 停止省略协议缓冲区中的默认值

我有一个定义如下的原型模式,

现在根据官方proto3 文档,默认值不会序列化以在有线传输期间节省空间。但在我的情况下,我想接收客户端是否明确设置true/false了字段email_subscribed/sms_subscribed(因为这些值是true以前的,但现在用户想要取消订阅)。因此,当客户端发送false这些字段中的任何一个时,生成器代码序列化器只会忽略这些字段。

我如何实现这一点并避免在上述情况下省略这些字段?

PS:我使用 Javascript 作为我的 GRPC 客户端和 Python 和 GRPC 服务器。

0 投票
1 回答
875 浏览

protocols - 如何定义具有可变有效负载长度的 *.proto 文件?

我尝试编写我的第一个 *.proto 文件。这是我的尝试:

标头具有字段长度。此值定义有效负载中数据字段的长度。这就是我的问题:数据字段是动态的,我现在不知道大小。我可以将标头和有效负载拆分为 2 个单独的 *.proto 文件。但是我仍然不知道如何动态设置其中一个字段的长度。

在此先感谢您的帮助!

0 投票
1 回答
195 浏览

java - 发送 protobuf java 文件或 JsonFormat 字符串

首先是一些背景知识:我有一个系统,其中客户端点击 API 以获取一些资源。API 调用微服务来获取所需的数据。API 的工作是最终向客户端发送一个 json 字符串(由从微服务获取的数据构造)

客户端是一个需要 application/json 的遗留系统。但是,我希望 API 和微服务通过 http 使用 application-x-protobuf 进行通信。

我的问题是将我的 proto java 文件转换为微服务本身的字符串然后将其发送到 API 是否有意义?或者这是否违背了使用 proto 的目的?

JsonFormat.printer().print(myprotofile)为了利用 protobuf 的速度,是否有必要通过网络发送一个 proto java 文件,而不是从 proto java 文件 () 转换的字符串?

0 投票
2 回答
8511 浏览

protocol-buffers - 由于默认值,Protobuf 忽略 bool 和 ints 值

我正在将 json 文件转换为字符串,然后将字符串转换为 proto3 文件。

这是json文件:

这是我将 json 文件转换为字符串的方法:

这是我将字符串转换为 proto3 文件的方法:

我的 json 中有 boolean 和 int 字段,其中一些字段的值必须是默认值(布尔为 false,int 为 0)。

当我将上述文件反序列化为 proto3 java 文件时,上述两个字段都将被忽略,即使我已明确设置值(如您在上述 json 文件中所见),我的 json 也会变为空。

我知道 proto3 在反序列化/序列化时会忽略默认值,但是有没有办法不忽略显式设置的字段,即使它们是默认值?