Я использую TCP-клиент / сервер для отправки сообщений Cap’n Proto из C ++ в Java.
Иногда приемный буфер может быть переполнен или переполнен, и для обработки этих случаев нам нужно знать размер сообщения.
Когда я проверяю размер буфера в Java, я получаю 208 байтов, однако вызывая
MyModel.MyMessage.STRUCT_SIZE.total()
возвращает 4 (не уверен, какая единица измерения используется здесь).
Я заметил, что 4 делится на 208, 52 раза. Но я не знаю значительного коэффициента пересчета с использованием 52.
Как проверить размер сообщения в Java?
MyMessage.STRUCT_SIZE
представляет постоянный размер самой этой структуры (измеряется в 8-байтовых словах), но если структура содержит нетривиальные поля (такие как Text, Data, List или другие структуры), то они также занимают пространство и объем пространства они принимают не константа (например, Text будет занимать пространство в зависимости от длины строки).
Как правило, вы должны попытаться позволить Cap’n Proto напрямую писать / читать с соответствующих ByteChannel
s, так что вам не нужно следить за размерами самостоятельно. Однако, если вам действительно нужно вычислить размер сообщения заранее, вы можете сделать это с помощью чего-то вроде:
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
с потоковым вводом / выводом.