如何在数据本身之前发送序列化数据的大小?

时间:2014-06-03 11:47:26

标签: java serializable

我正在装箱客户端 - 服务器聊天应用程序。在发现数据字节发送的C / C ++方法是Java真正的痛苦(签名字节只是搞笑),我开始尝试使用更方便的方法 - 特别是Serializable接口和ObjectOutputStream以及ByteArrayOutputStream

This answer完全描述了我目前所知道的事情。

因此,我可以将我的对象转换为字节数组,然后可以将其放入最终发送的输出缓冲区(发送以异步方式完成)。

现在有了对象,我需要先发送字节数组的大小 - 这样接收函数就可以在解析对象之前知道应该读取多少数据。

所以在这段代码中:

  out = new ObjectOutputStream(bos);   
  out.writeObject(this);
  return bos.toByteArray();

我可以以某种方式预先添加对象大小吗?

  out = new ObjectOutputStream(bos);   
  out.writeObject(this);
  //PSEUDO FUNCTION - beware
  out.writeIntOnOffset(out.size(), 0) //Push the size on the beginning of the array
  return bos.toByteArray();

2 个答案:

答案 0 :(得分:0)

一旦你有对象大小,只需发送它:

MyClass obj = ....;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj); // this is what you already have.
int size = baos.length; // now we have size

OutputStream socketStream = .... // I guess you know how to get it. 
ObjectOutputStream socketOos = new ObjectOutputStream(socketStream);
socketOos.writeInt(size);
socketOos.write(baos.toByteArray());

答案 1 :(得分:-1)

你绝对不应该把它自己弄得乱七八糟。 相反,您应该创建一个返回大小的单独方法