如何序列化 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的主要内容,如果未能解决你的问题,请参考以下文章