Cap’n Proto — поиск размера сообщения в Java

Я использую TCP-клиент / сервер для отправки сообщений Cap’n Proto из C ++ в Java.

Иногда приемный буфер может быть переполнен или переполнен, и для обработки этих случаев нам нужно знать размер сообщения.

Когда я проверяю размер буфера в Java, я получаю 208 байтов, однако вызывая

MyModel.MyMessage.STRUCT_SIZE.total()

возвращает 4 (не уверен, какая единица измерения используется здесь).

Я заметил, что 4 делится на 208, 52 раза. Но я не знаю значительного коэффициента пересчета с использованием 52.

Как проверить размер сообщения в Java?

2

Решение

MyMessage.STRUCT_SIZE представляет постоянный размер самой этой структуры (измеряется в 8-байтовых словах), но если структура содержит нетривиальные поля (такие как Text, Data, List или другие структуры), то они также занимают пространство и объем пространства они принимают не константа (например, Text будет занимать пространство в зависимости от длины строки).

Как правило, вы должны попытаться позволить Cap’n Proto напрямую писать / читать с соответствующих ByteChannels, так что вам не нужно следить за размерами самостоятельно. Однако, если вам действительно нужно вычислить размер сообщения заранее, вы можете сделать это с помощью чего-то вроде:

ByteBuffer[] segments = message.getSegmentsForOutput();
int total = (segments.length / 2 + 1) * 8;  // segment table
for (ByteBuffer segment: segments) {
total += segment.remaining();
}
// now `total` is the total number of bytes that will be
// written when the message is serialized.

На размер C ++, вы можете использовать capnp::computeSerializedSizeInWords() от serialize.h (и умножить на 8).

Но опять же, вы действительно должны структурировать свой код, чтобы избежать этого, используя методы org.capnproto.Serialize с потоковым вводом / выводом.

2

Другие решения


По вопросам рекламы [email protected]