我正在开发一个使用套接字进行所有通信的简单客户端/服务器应用程序。通信是基于数据包的,并且数据包的概念是通过使用一组类和用于套接字流的ObjectInputStream
/ObjectOutputStream
包装器来实现的。
想知道与完全基于文本的协议(protocol)(例如IRC)还是“非常二进制”的东西(我明确使用字节)相比,这种方法是否有任何缺点。
让我们忽略此处的流量问题(“qwerty”与“qwerty” + 1KB元数据),仅考虑可靠性和可维护性。
你怎么认为?
最佳答案
我个人发现Java内置的二进制序列化非常痛苦。即使您没有更改任何可能引起问题的更改,也很容易导致版本不兼容。
在以下情况下这不是问题:
也许这就是您的情况-但就我个人而言,我更喜欢一种序列化格式,该格式可使我在版本控制方面更加灵活。现在,这当然不需要它是二进制或文本了。您可以使用JSON,Protocol Buffers,Thrift或任意数量的其他选项。每个版本都有各自的优缺点-但是每个版本在设计时都考虑到了比Java更简单的版本兼容性。
现在,Java序列化的好处是,当您处在一切正常的情况下(您的整个树都是可序列化的),您只需对其进行序列化即可,而无需进行其他更改-您不需要像对数据那样单独建模数据一些序列化框架。不幸的是,一旦您想使用无法在树中某个位置进行序列化的类,您就会陷入痛苦之中……
至于文本和二进制形式之间的选择-优缺点是相当明显的。文本较大,但是仅通过查看网络跟踪就可以更轻松地诊断正在发生的事情。当然,您需要确保双方都使用相同的编码。
哦,当然,如果您想与非Java客户端/服务器通信,那么使用Java的 native 序列化将很困难:)
关于java - 使用ObjectInputStream/ObjectOutputStream在Java中实现网络 “packets”的优缺点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7055429/