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

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

让我们忽略此处的流量问题(“qwerty”与“qwerty” + 1KB元数据),仅考虑可靠性和可维护性。

你怎么认为?

最佳答案

我个人发现Java内置的二进制序列化非常痛苦。即使您没有更改任何可能引起问题的更改,也很容易导致版本不兼容。

在以下情况下这不是问题:

  • 您可以保证您的客户端/服务器都将完全运行相同版本的代码。
  • 无需读取以前版本写入的任何数据。

  • 也许这就是您的情况-但就我个人而言,我更喜欢一种序列化格式,该格式可使我在版本控制方面更加灵活。现在,这当然不需要它是二进制或文本了。您可以使用JSON,Protocol BuffersThrift或任意数量的其他选项。每个版本都有各自的优缺点-但是每个版本在设计时都考虑到了比Java更简单的版本兼容性。

    现在,Java序列化的好处是,当您处在一切正常的情况下(您的整个树都是可序列化的),您只需对其进行序列化即可,而无需进行其他更改-您不需要像对数据那样单独建模数据一些序列化框架。不幸的是,一旦您想使用无法在树中某个位置进行序列化的类,您就会陷入痛苦之中……

    至于文本和二进制形式之间的选择-优缺点是相当明显的。文本较大,但是仅通过查看网络跟踪就可以更轻松地诊断正在发生的事情。当然,您需要确保双方都使用相同的编码。

    哦,当然,如果您想与非Java客户端/服务器通信,那么使用Java的 native 序列化将很困难:)

    关于java - 使用ObjectInputStream/ObjectOutputStream在Java中实现网络 “packets”的优缺点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7055429/

    10-11 00:57
    查看更多