消息的自定义java序列化
在wire上写消息时,我想先写下数据中的字节数,然后再写下数据 信息格式:消息的自定义java序列化,java,serialization,Java,Serialization,在wire上写消息时,我想先写下数据中的字节数,然后再写下数据 信息格式: {num of bytes in data}{data} 我可以通过将数据写入临时byteArrayOutput流,然后从中获取字节数组大小,然后写入字节数组大小。这种方法涉及大量开销,即。不必要地创建临时字节数组、创建临时流等 我们是否有更好的(同时考虑CPU和垃圾创建)方法来实现这一点 以下是我将要做的事情,按优先顺序排列 不要担心内存消耗之类的问题。这很可能已经是最佳的解决方案,除非创建数据的字节表示需要花费大量
{num of bytes in data}{data}
我可以通过将数据写入临时byteArrayOutput流,然后从中获取字节数组大小,然后写入字节数组大小。这种方法涉及大量开销,即。不必要地创建临时字节数组、创建临时流等
我们是否有更好的(同时考虑CPU和垃圾创建)方法来实现这一点 以下是我将要做的事情,按优先顺序排列
一种典型的方法是引入一个可重用的
ByteBuffer
。例如:
ByteBuffer out = ...
int oldPos = out.position(); // Remember current position.
out.position(oldPos + 2); // Leave space for message length (unsigned short)
out.putInt(...); // Write out data.
// Finally prepend buffer with number of bytes.
out.putShort(oldPos, (short)(out.position() - (oldPos + 2)));
填充缓冲区后,您可以使用
SocketChannel.write(ByteBuffer)
(假设您使用的是NIO)通过线路发送数据。如何存储数据?你从哪里得到它?@Bombe:这将与有线协议表示有关的代码与每个对象的业务逻辑混合在一起。我更喜欢使用单独的类来处理协议编码/解码。这意味着我可以独立于我的业务对象改变协议,并可能支持多个协议。这意味着你已经有了一些编码器/解码器类?如果是这样的话,只需将getLength()方法集成到这些函数中即可。否则,除了先将对象写入字节数组(如上图所示,通过ByteArrayOutputStream
或ByteBuffer
)之外,您可能别无选择。谢谢Bombie。这是我尝试过的解决方案。但是,我也希望支持java对象序列化,不希望为我编写的每个对象编写自定义序列化。