棘手的java序列化问题

时间:2010-01-12 23:32:21

标签: java serialization

我有一个java服务器,必须通过TCP套接字与用C编写的外部程序进行通信。它们以无法更改的消息协议来回传递消息(由于原因太复杂而无法进入此处)。

TCP消息传递协议看起来大致如下:

标题(带有消息长度) - >消息正文 - >消息CRC

在我看来,这样最好在java端使用ObjectInputStream / ObjectOutputStream对和实现java.io.Serializable并具有自己的writeObject()和readObject()方法的类来处理。问题是,我能想到实现这种消息传递协议的唯一解决方案涉及一个额外的间接层,如果可能的话我想避免这种解决方案。

diffculty是套接字的写入部分,因为消息长度位于消息体的前面。我目前的解决方案是将消息体写入辅助ObjectOutputStream(仅用于了解消息长度),然后将标头(带有长度)写入套接字,然后是主体,然后是CRC。

我的问题是:有没有比使用临时ObjectOutputStream更好的方法呢?这看起来很浪费。

感谢。

3 个答案:

答案 0 :(得分:2)

如果没有更多细节,我建议您不要使用Object Streams,他们会将Java对象序列化为一种实际上只能读回Java对象的格式。你的C程序实际上无法对你发送的内容做任何事情。

您可能只是使用字节数组流来发送C程序可以读取的数据类型。您将能够读取字节数组的长度来计算CRC。

答案 1 :(得分:0)

如果您知道消息的最大大小,我只需要认真考虑创建一个字节数组并使用一种方法将消息直接写入其中,留出长度的空间。

然后,当您编写完所有数据字节后,返回并输入长度并计算CRC。然后你应该能够将整个字节数组(限于实际长度)推送到oter端。

如果您知道最大尺寸,您可以使用矢量或其他集合之一。为了提供所有序列化的东西,只是为了运送字节缓冲区,这似乎是一项大于必要的工作。

答案 2 :(得分:0)

不要序列化对象(除非你想搞乱你最不可能的外化)。

只需根据规范生成字节并发送它们而不会使其更复杂。