Как смоделировать примитивный массив Java int [] в сообщении protobuf

Я новичок в буферах протокола Google и пытаюсь смоделировать примитивный массив int[] в java с помощью сообщения protobuf.

В настоящее время я использую этот прото-файл:

syntax = "proto3";
package protobuf;

message primitiveArrayMsg {
    repeated int32 data = 1;
}

Которая компилируется в класс java со структурой данных List<Integer> вместо массива примитивов int.

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

Мое приложение должно содержать миллионы значений int, и для экономии памяти я решил использовать int вместо Integer. Есть ли способ скомпилировать описание сообщения protobuf в классе java со структурой данных int[]?

К сожалению, я ничего не нашел в Руководстве по языку протокольных буферов (proto3). Аналогичный вопрос также задавался в Как добавить массив int в protobuf сообщение, которое я пробовал, но, очевидно, автор вопроса искал ArrayList<Integer>, и поэтому ответ мне не помог.

Если для этого нет поддержки, можете ли вы порекомендовать мне более эффективный с точки зрения памяти способ, чем упаковка в Integer и использование List<Integer>?


person Bernhard    schedule 30.11.2018    source источник
comment
Вы уверены, что он действительно так хранит список? Например, getData(int) вернет вам значение без упаковки. Было бы неэффективно, если бы он сохранял упакованное значение, распаковывая значение, чтобы вернуть его вам, только для того, чтобы вам пришлось снова упаковывать его. Возможно, что getDataList() - это просто бокс для int[], но он должен вернуть вам List<Integer>, потому что это все, что может предоставить List.   -  person Andy Turner    schedule 01.12.2018


Ответы (1)


Сообщения Protocol Buffer не предназначены для обработки больших сообщений.

Несмотря на то, что целые числа эффективно упакованы по умолчанию при использовании proto3, в оперативной памяти потребуется большое количество объектов Integer (если только несколько отдельных значений не используются, и в этом случае объекты Integer можно использовать повторно).

Если вам действительно нужно использовать для этого сообщения Protocol Buffer, другой вариант - транскрибировать массивы int в формат байтового массива и обратно при кодировании / декодировании.

person volley    schedule 01.12.2018