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

标签 java sockets dataoutputstream datainputstream

我正在开发一个简单的客户端/服务器应用程序,它使用套接字进行所有通信。通信是基于数据包的,数据包的概念是使用一组类和套接字流的 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/

相关文章:

java - 解析 postgres 对象文字

java - java中是否有可能捕获致命的xml异常?

java - 是否可以在不首先生成客户端 stub /代理的情况下从 Java 客户端使用 EJB 3 Web 服务?

java - 等待客户端读取消息的套接字服务器

java - 相当于Objective C中Java的DataOutputStream

java - 在 Java 中通过 DataOutputStream 发送多个 POST 请求

java - 如何从字符串写入二进制文件并将其再次检索到字符串?

Java 冒泡排序具有 3 个元素的反向排序数组。

javascript - 多个套接字客户端

node.js - Socket.IO 与 HapiJS 的连接