2

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

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

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. 有没有办法在具有int[]数据结构的 java 类中编译 protobuf 消息描述?

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

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

4

1 回答 1

2

Protocol Buffer 消息不是为处理大型消息而设计的

尽管在使用 proto3 时默认情况下整数被有效地打包,但在运行时内存中仍需要大量 Integer 对象(除非实际使用的不同值很少,在这种情况下可以重用 Integer 对象)。

如果您确实必须为此使用协议缓冲区消息,则另一种选择是在编码/解码时将 int 数组转换为字节数组格式或从字节数组格式转录。

于 2018-12-01T00:14:43.357 回答