【问题标题】:Pros and cons for using ObjectInputStream/ObjectOutputStream to implement network "packets" in Java?使用 ObjectInputStream/ObjectOutputStream 在 Java 中实现网络“数据包”的利弊?
【发布时间】:2011-10-26 16:38:16
【问题描述】:

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

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

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

你怎么看?

【问题讨论】:

    标签: java sockets dataoutputstream datainputstream


    【解决方案1】:

    就我个人而言,我发现 Java 中内置的二进制序列化非常痛苦。即使您没有更改任何您预期会导致问题的东西,也很容易以版本不兼容而告终。

    这不是问题,如果:

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

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

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

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

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

    【讨论】:

    • +1:大多数二进制格式比文本格式小,但是文本序列化可以比 Java 序列化小(因为后者效率很低)。
    【解决方案2】:

    保持与序列化对象的向后可比性很痛苦,而且非 Java 客户端无法与您的服务对话。序列化对象在序列化大小方面也不是很好。

    我会改用协议缓冲区之类的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 2012-05-29
      • 2019-08-02
      • 2014-08-19
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多