如何序列化ByteBuffer

时间:2010-10-20 22:01:58

标签: java rmi bytebuffer

我希望使用RMI在网络中发送java.nio.ByteBuffer,但是ByteBuffer不可序列化。我尝试过以下自定义类无济于事:

public class NetByteBuffer implements java.io.Serializable {

ByteBuffer buffer;

public NetByteBuffer(ByteBuffer buffer) {
    this.buffer = buffer;
}

public ByteBuffer getByteBuffer() {
    return this.buffer;
}

}

客户端仍然会收到不可序列的异常。有什么想法吗?

由于

4 个答案:

答案 0 :(得分:6)

你做不到。您最好获取byte[]并将其发送,然后重新构建另一侧的ByteBuffer。你当然失去了它作为缓冲区的优势。

答案 1 :(得分:4)

像其他人一样说ByteBuffer是一个字节缓冲区的包装,所以如果你需要序列化你的类,最好更改为byte []并在正在读/写数据到这个bean的类中使用ByteBuffer。

但是如果您需要序列化ByteBuffer属性(例如使用Cassandra blobs),您始终可以实现自定义序列化(请检查此URL http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html)。

要点是:

  1. 将ByteBuffer标记为瞬态(因此默认情况下未将其序列化)
  2. 实现自己的序列化读/写,其中ByteBuffer - >字节[]在序列化时和字节[] - > ByteBuffer关于反序列化。
  3. 试试这堂课,让我知道这是否适合你:

    public class NetByteBuffer implements java.io.Serializable {
        private static final long serialVersionUID = -2831273345165209113L;
    
        //serializable property
        String anotherProperty;
    
        // mark as transient so this is not serialized by default
        transient ByteBuffer data;
    
        public NetByteBuffer(String anotherProperty, ByteBuffer data) {
            this.data = data;
            this.anotherProperty = anotherProperty;
        }
    
        public ByteBuffer getData() {
            return this.data;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            // write default properties
            out.defaultWriteObject();
            // write buffer capacity and data
            out.writeInt(data.capacity());
            out.write(data.array());
    
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            //read default properties
            in.defaultReadObject();
    
            //read buffer data and wrap with ByteBuffer
            int bufferSize = in.readInt();
            byte[] buffer = new byte[bufferSize];
            in.read(buffer, 0, bufferSize);
            this.data = ByteBuffer.wrap(buffer, 0, bufferSize);
        }
    
        public String getAnotherProperty() {
            return anotherProperty;
        }
    
    }
    

答案 2 :(得分:1)

您可能需要详细说明为什么要序列化字节缓冲区。如果您只是想通过网络发送大量字节,@ Bozho的回答可以让您满意。

如果你真的希望发送ByteBuffer包括其内容和状态,你可能需要重新考虑你的设计,或者至少在这里解释一下,以便其他人可以提供更多指导。

答案 3 :(得分:0)

很长的路要走,但你的目标可以实现:

你可以使用实例变量类型“ByteBuffer”创建一个远程对象,并定义getter和setter远程方法来访问该变量。