如何序列化 ByteBuffer

Posted

技术标签:

【中文标题】如何序列化 ByteBuffer【英文标题】:How to serialize ByteBuffer 【发布时间】:2010-10-20 22:01:57 【问题描述】:

我希望使用 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;

客户端仍然得到一个不可序列化的异常。有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

你不能。您最好获取byte[] 并发送它并在另一侧重建ByteBuffer。您当然会失去它作为缓冲区的优势。

【讨论】:

我会失去哪些优势?这是来自 Filechannel.map 的 PDF 文件 如果您在没有特定原因的情况下使用ByteBuffer,那么使用字节数组也许是安全的;)【参考方案2】:

像其他人所说的 ByteBuffer 是字节缓冲区的包装,因此如果您需要序列化您的类,最好更改为 byte[] 并在读取/写入数据到此 bean 的类中使用 ByteBuffer。

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

主要有以下几点:

    将 ByteBuffer 标记为瞬态(因此默认不序列化) 实现您自己的读/写序列化,其中 ByteBuffer --> byte[] 序列化时和 byte[] --> ByteBuffer 反序列化。

试试这个课程,让我知道这是否适合你:

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;
    


【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于如何序列化 ByteBuffer的主要内容,如果未能解决你的问题,请参考以下文章

c# sorket序列化反序列化如何如何传接Object?

什么是序列化,在java中如何实现序列化?

如何序列化一个 lambda?

什么是序列化? 如何实现(反)序列化 序列化的应用

什么是序列化? 如何实现(反)序列化 序列化的应用

什么是序列化? 如何实现(反)序列化 序列化的应用