Cap'n Proto - 在 Java 中查找消息大小

Cap'n Proto - Finding Message Size in Java

本文关键字:Java 查找 消息 Proto Cap      更新时间:2023-10-16

我正在使用TCP客户端/服务器从c++发送Cap'n Proto消息到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,这样您就不必自己跟踪大小。但是,如果您确实必须提前计算消息的大小,您可以这样做:

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++大小上,您可以使用serialize.h中的capnp::computeSerializedSizeInWords()(并乘以8)。

但是,你真的应该通过使用org.capnproto.Serialize的方法和流I/o来构建你的代码来避免这种情况。