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

时间:2018-11-30 23:13:36

标签: java serialization protocol-buffers protobuf-java google-protocol-buffer

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

当前我正在使用此原始文件:

syntax = "proto3";
package protobuf;

message primitiveArrayMsg {
    repeated int32 data = 1;
}

将其编译为具有List<Integer>数据结构而不是原始int数组的Java类。

/**
 * <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>的存储效率更高的方法吗?

1 个答案:

答案 0 :(得分:0)

协议缓冲区消息为not designed to handle large messages

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

如果您确实需要为此使用协议缓冲区消息,那么另一种选择是在进行编码/解码时,将int数组与字节数组格式互写。