使用ObjectInputStream / ObjectOutputStream在Java中实现网络“数据包”的利弊?

时间:2011-08-14 06:33:17

标签: java sockets dataoutputstream datainputstream

我正在开发一个简单的客户端/服务器应用程序,它使用套接字进行所有通信。通信是基于数据包的,数据包的概念是使用一组类和ObjectInputStream / ObjectOutputStream套接字流的包装器实现的。

想知道这种方法与基于全文本的协议(如IRC)或“非常二进制”的东西相比是否有任何缺点,我明确使用字节。

让我们忽略这里的流量问题(“qwerty”与“qwerty”+ 1KB元数据)并且只考虑可靠性和可维护性。

您怎么看?

2 个答案:

答案 0 :(得分:5)

就我个人而言,我发现Java中内置的二进制序列化非常痛苦。即使你没有改变任何你期望引起问题的东西,也很容易导致版本不兼容

如果出现以下问题,那不是问题:

  • 您可以保证您的客户端/服务器都运行完全相同的代码版本。
  • 您永远不需要阅读以前版本编写的任何数据。

也许这就是你的情况 - 但我个人更喜欢序列化格式,这使我可以更灵活地进行版本控制。现在这不要求它当然是二进制或文本。您可以使用JSON,Protocol BuffersThrift或任意数量的其他选项。每个都有不同的优点和缺点 - 但每个都可能设计为比Java更简单的版本兼容性。

现在,Java序列化的优势就是当你处于一切正常的情况下(你的整个树都是可序列化的)时,你可以将它序列化而不需要其他更改 - 你不需要单独建模数据,就像使用某些序列化框架一样。不幸的是,只要您想在树中的某个地方使用不可序列化的类,您就会感到痛苦......

至于文本和二进制形式之间的选择 - 优点和缺点合理显而易见。文本更大,但通过查看网络跟踪更容易诊断正在发生的事情。当然,您需要确保双方使用相同的编码。

哦,当然,如果你想与非Java客户端/服务器进行通信,如果你使用了Java的本机序列化,那么你将会遇到困难:)

答案 1 :(得分:2)

使用序列化对象保持向后可比性是一种痛苦,非Java客户端无法与您的服务进行通信。序列化对象在序列化大小方面也不是很好。

我会使用像协议缓冲区这样的东西。