问题标签 [protobuf-java]

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 投票
1 回答
1451 浏览

java - 如何在 protobuf 消息中建模 Java 原始 int[] 数组

我是 Google 协议缓冲区的新手,并试图int[]通过 protobuf 消息在 java 中对原始数组进行建模。

目前我正在使用这个原型文件:

它编译为具有List<Integer>数据结构而不是原始数组的java 类int

我的应用程序必须保存数百万个 int 值,并且为了节省内存,我决定int使用Integer. 有没有办法在具有int[]数据结构的 java 类中编译 protobuf 消息描述?

不幸的是,我在Protocol Buffers Language Guide (proto3)中一无所获。How to add a int array in protobuf message中也提出了类似的问题,我尝试过,但显然问题作者正在寻找一个ArrayList<Integer>,因此答案对我没有帮助。

如果没有对此的支持,您能否向我推荐一种比装箱Integer和使用更节省内存的方法List<Integer>

0 投票
2 回答
4837 浏览

java - Protobuf:原始二进制数据到 json

我所拥有的只是原始 protobuf 二进制数据,我无权访问 .proto 文件,我需要将其转换为 Java 中的 json 字符串。那么有没有办法在java中做到这一点?即类似于 protoc 工具的东西

0 投票
1 回答
65 浏览

protobuf-java - Protobuf3:当对象的所有字段都设置为默认值时会发生什么

我对 proto3 的理解是,对于标量,无法区分消息发送者是否将字段设置为默认值,或者根本没有设置该字段,因为默认值不是通过网络发送的。也就是说,无论是否设置了默认值,对该字段的 hasField 调用都将返回 false。只有当字段设置为默认值以外的其他值时,hasField 才会返回 true。

我已经阅读了一些关于使用对象作为包装器来解决这种情况的内容,但我仍在尝试了解它是如何工作的,例如:https ://github.com/protocolbuffers/protobuf/blob/master/src/google/ protobuf/wrappers.proto

我的问题是:如果一个对象的所有字段都设置为默认值,该对象是否仍会通过网络发送?或者该对象的 hasFields 是否会返回 False?

0 投票
1 回答
124 浏览

protocol-buffers - 包装和运输 protoc,因此我们的构建环境不需要预先安装 protoc

为了能够从 .proto 文件生成类,我必须在我的系统上安装protoc 。然后我可以手动指示 protoc 编译我的 .proto 文件。然后我可能会想到利用我们的构建系统来实现这一点,例如有一个 maven 插件可以很好地完成这项工作,我会像这样添加它:

所以每次我触发构建时,插件都会生成我的类。一切都很好。但是如果我们看一下插件,在调用 build: 的系统上安装 protoc 仍然是一个硬性要求<protocExecutable>protoc</protocExecutable>

现在的问题是

为了让它“工作”,我们所有的开发人员、构建系统……必须在他们的系统上拥有完全相同的协议缓冲区版本,否则生成的代码可能会有所不同(甚至中断)。这也意味着,随着代码变旧,我们可能无法在所有构建系统上构建它,因为安装的 protoc 版本会更新(我猜你可能会争辩为每个版本安装一个 protoc 并使用 eg 调用它protocv3)这将需要额外的维护。

protoc 是否有一些东西,比如 gradle 构建系统对它们的gradlew, 所以基本上是一个脚本,它会尝试在调用编译器之前在运行构建的系统上安装特定的 protoc?这样我们就可以将“protow”与源代码一起冷存储在我们的 VCS 中,就像使用 gradlew 一样。总是为当前项目使用“正确”的协议版本?

0 投票
1 回答
2386 浏览

protocol-buffers - protoc 命令未生成所有基类(java)

我一直在尝试从 grpc 官方 repo 的服务定义中生成基本的 gRPC 客户端和服务器接口.proto。该文件中定义的相关服务(来自上面的链接)如下:

我运行的命令是protoc --java_out=${OUTPUT_DIR} path/to/proto/file

根据 grpc 站点(特别是这里),aRouteGuideGrpc.java包含一个基类RouteGuideGrpc.RouteGuideImplBase,RouteGuide 服务中定义的所有方法都应该是从protoc上面的命令生成的,但该文件没有为我生成。

有没有人遇到过类似的问题?官方文档根本不正确吗?有人对我能做些什么来生成那个缺失的课程有什么建议吗?

0 投票
1 回答
483 浏览

android - com.android.tools.r8.errors.CompilationError:程序类型已存在:com.google.protobuf.AbstractMessageLite$Builder$LimitedInputStream

我正进入(状态

“程序类型已经存在:com.google.protobuf.AbstractMessageLite$Builder$LimitedInputStream”运行时错误。我尝试使用 multidix 并且还引用了更多链接,但仍然没有得到任何解决方案。

这是因为在 protobuf lite 和 protobuf jar 文件中作为同一个类。我的依赖是,

由于我的库文件和 protobuf 插件都在下面

由于这个原因,在 jar 文件中生成相同的 java 类我可能会收到此错误“程序类型已存在”

我已经尝试过multidex,排除代码但它都不起作用

我已经尝试使用 multidix 并且还引用了更多链接,但仍然没有得到任何解决方案。

0 投票
1 回答
441 浏览

protocol-buffers - 如何在 gRPC 的快速启动模板中添加新的 .proto 文件并生成所有必需的 java 文件?

我希望在现有的 grpc-java 快速启动模板中从头开始添加我自己的 .proto 文件。如何生成所有必要的类文件并将它们与 maven(或 gradle)文件绑定。

0 投票
1 回答
349 浏览

java - Java protobuf 在根消息和子消息中设置字段

我们如何从在 java 中嵌套消息的 protobuf 构建消息实例。

通过在 protobuf 的嵌套消息中设置根字段和字段并返回整个消息的实例来使用下面描述的 proto。

在上面的消息中,我想通过在根处设置字段“e”并在嵌套消息中设置字段,如“数量”中的“a”、“b”和“质量”中的“c”来返回一个信封实例. 我怎样才能做到这一点 ?

0 投票
0 回答
99 浏览

java - java - 如何在java中逐条消息地部分读取protobuf文件?

我想用 protobuf java 读取一个大文件。

目前,我只能完整地读取文件,这是不切实际的,因为它是一个大文件。

而我这样做:

或者

整个文件和所有消息都加载到内存中。

inputStream这是一个InputStream流压缩文件。

是否可以在不使用太多内存的情况下按顺序加载它们?

0 投票
2 回答
5183 浏览

kotlin - Protobuf 中的 Kotlin 数据类支持

我最近在我们的 kotlin 项目中实现了 protobuf。我正在接收二进制数据并使用 proto 文件将其反序列化为 Proto 对象。

但我希望将其转换为数据类。我找不到有关如何执行此操作的任何支持信息。

是否可以从二进制数据或反序列化的原型对象中获取数据类?