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

标签 java serialization protobuf-java protocol-buffers

我是 Google Protocol buffers 的新手,正在尝试对原语进行建模 int[]通过 protobuf 消息在 java 中数组。

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

syntax = "proto3";
package protobuf;

message primitiveArrayMsg {
    repeated int32 data = 1;
}

编译为一个带有 List<Integer> 的 java 类数据结构而不是原始数组int .

/**
 * <code>repeated int32 data = 1;</code>
 */
java.util.List<java.lang.Integer> getDataList();

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

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

如果不支持这一点,你能给我推荐一种比装箱到 Integer 更有效的内存方式吗?并使用 List<Integer>

最佳答案

Protocol Buffer 消息为 not designed to handle large messages .

尽管整数是 efficiently packed默认情况下,使用 proto3 时,运行时内存中需要大量 Integer 对象(除非实际上使用过很少的不同值,在这种情况下,可以重新使用 Integer 对象)。

如果您确实必须为此使用 Protocol Buffer 消息,另一种选择是在编码/解码时将 int 数组转录为字节数组格式,或者从字节数组格式转录而来。

关于java - 如何在 protobuf 消息中对 Java 原始 int[] 数组进行建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53566164/

相关文章:

java.lang.ClassNotFoundException : xsbt. 与 PlayFramework 的编译器接口(interface)

java - 找不到类 JUNIT org.junit.runner.JUnitCore

java - 从 Spring Boot 执行 Neo4j 密码查询

Scala 反射与序列化(通过 Spark) - 符号不可序列化

android - 解决 Firebase In App Messaging 和 Dialogflow 依赖项

java - 使用 protobuf for java 时使用 gradle 重复处理策略错误

java - 在现有的 Jira 问题中添加附件

json - 从 Jackson-Module-Scala 2.4 迁移到 2.5

java - JsonSerializer 不适用于使用 GSON 的嵌套对象

java - Map List<String> with Mapstruct 从 Java POJO 到 Protobuf (proto3)