gpt4 book ai didi

java - 在Java中使用ObjectInputStream/ObjectOutputStream实现网络 "packets"的优点和缺点?

转载 作者:行者123 更新时间:2023-12-02 05:12:17 24 4
gpt4 key购买 nike

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

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

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

你觉得怎么样?

最佳答案

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

如果满足以下条件,这不是问题:

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

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

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com