当前位置: 首页 > 知识库问答 >
问题:

如何建模Java原始的int[]数组的消息

葛和志
2023-03-14

我是谷歌协议缓冲区的新手,并试图通过一个原型消息在java中建模一个原始int[]数组。

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

syntax = "proto3";
package protobuf;

message primitiveArrayMsg {
    repeated int32 data = 1;
}

它编译为一个java类,其中包含一个<代码>列表

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

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

不幸的是,我在协议缓冲区语言指南(proto3)中找不到任何内容。在如何在protobuf消息中添加int数组中也提出了类似的问题,我尝试了这个问题,但很明显,问题的作者正在寻找一个数组列表

如果不支持,您能推荐一种比装箱到整数和使用列表更节省内存的方法吗

共有1个答案

景信瑞
2023-03-14

协议缓冲区消息不是为处理大消息而设计的。

即使在默认情况下,使用协议3时整数被有效地打包,运行时内存中也需要大量的整数对象(除非实际使用的不同值很少,在这种情况下可以重新使用整数对象)。

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

 类似资料:
  • 问题内容: 我有一个和一帮在里面。我想把它变成一个数组,但是打电话 返回。除了手动遍历每个元素,还有更好的方法将其转换为其他数组吗?我想将数组传递给 即使我尝试将其像强制转换那样也不会接受Object []数组 问题答案: Apache的ArrayUtils具有以下功能(它仍在幕后进行迭代): 它们始终是检查此类事情的好地方。

  • 问题内容: 我正在尝试使用以下代码将包含Integer对象的ArrayList转换为原始int [],但它会引发编译时错误。是否可以用Java进行转换? 问题答案: 你可以进行转换,但是我认为没有内置的功能可以自动进行转换: (请注意,如果其中一个或任何一个元素为,则会抛出。) 编辑:根据评论,你可能希望使用列表迭代器来避免诸如:

  • 问题内容: 我看到了一个问题:从数组创建ArrayList 但是,当我使用以下代码尝试该解决方案时,它并不能在所有情况下都有效: 我在这里做错了什么?代码不应该编译就好吗? 问题答案: 问题在 是,被认为是一个单一的,因为基本数组从延伸实例。如果你有这样的工作,而不是因为现在你要发送的数组。 根据您的评论:如果您仍然想使用一个(或另一个原始类型的数组)作为主要数据,那么您需要使用wrapper类创

  • 问题内容: 有没有办法在Java中创建原始int或任何原始类型的列表,如下所示? 看来我能做到 并将“ int”添加到此列表中。但这意味着我可以在此列表中添加任何内容。 我唯一的选择是创建一个int数组并将其转换为一个列表或创建一个Integer对象的列表吗? 问题答案: 在Java中,任何变量的类型都是原始类型或引用类型。泛型类型参数必须是引用类型。由于基元不扩展,因此它们不能用作参数化类型的泛

  • 我有模量 目前,我正在提取完整的260个字节(指数为4个字节,模数为256个字节)并编码为base 64。我使用以下shell命令这样做: 这给我以下字符串: 现在,当我拿钥匙的时候。pem密钥对表示模数 我得到这个字符串(我已经省略了标题 您可以看到,我提取的密钥数据和base64编码的密钥数据实际上存在于从密钥中提取的有效公钥数据的数据中。pem使用openssl。然而,开头有45个字符,我自

  • 我已经看到了这个问题:从数组创建ArrayList 然而,当我用下面的代码尝试该解决方案时,它并不是在所有情况下都有效: 我做错了什么?代码不应该