消息的自定义java序列化

消息的自定义java序列化,java,serialization,Java,Serialization,在wire上写消息时,我想先写下数据中的字节数,然后再写下数据 信息格式: {num of bytes in data}{data} 我可以通过将数据写入临时byteArrayOutput流,然后从中获取字节数组大小,然后写入字节数组大小。这种方法涉及大量开销,即。不必要地创建临时字节数组、创建临时流等 我们是否有更好的(同时考虑CPU和垃圾创建)方法来实现这一点 以下是我将要做的事情,按优先顺序排列 不要担心内存消耗之类的问题。这很可能已经是最佳的解决方案,除非创建数据的字节表示需要花费大量

在wire上写消息时,我想先写下数据中的字节数,然后再写下数据

信息格式:

{num of bytes in data}{data}
我可以通过将数据写入临时byteArrayOutput流,然后从中获取字节数组大小,然后写入字节数组大小。这种方法涉及大量开销,即。不必要地创建临时字节数组、创建临时流等


我们是否有更好的(同时考虑CPU和垃圾创建)方法来实现这一点

以下是我将要做的事情,按优先顺序排列

  • 不要担心内存消耗之类的问题。这很可能已经是最佳的解决方案,除非创建数据的字节表示需要花费大量时间,因此创建两次会产生明显的影响
  • (实际上,这更像我列表中的#37,其中#2到#36为空。)在所有数据对象中包含一个方法,该方法可以计算字节表示的大小,并且比创建字节表示占用的资源更少

  • 一种典型的方法是引入一个可重用的
    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对象序列化,不希望为我编写的每个对象编写自定义序列化。