【发布时间】:2011-01-15 20:53:23
【问题描述】:
在 Java 中执行 I/O 操作时,通常是使用像 ObjectInputStream 这样的对象数据流更有效(就计算资源而言)还是使用像 DataInputStream 这样的原始数据流更有效?
如果使用对象数据流更有效,那么当我们考虑到与创建对象相关的开销(尽可能少)时,对象数据流是否仍然更有效?
【问题讨论】:
在 Java 中执行 I/O 操作时,通常是使用像 ObjectInputStream 这样的对象数据流更有效(就计算资源而言)还是使用像 DataInputStream 这样的原始数据流更有效?
如果使用对象数据流更有效,那么当我们考虑到与创建对象相关的开销(尽可能少)时,对象数据流是否仍然更有效?
【问题讨论】:
如果操作正确,自定义序列化可以节省空间/带宽和 CPU 时间。
我建议你看看 google 的 Protocol Buffers - 非常高效且可移植的序列化库。
【讨论】:
您可以根据流中实际的数据类型来选择对象或数据输入流。如果是 Java 对象,则使用 Object 流,如果不是,则使用 DataInputStream(或其他适当的)。
那么您的流中有哪些类型的数据?
【讨论】:
ObjectInputStream 使用起来会更简单。在开始使用 DataInputStream 之前,我会检查这是否不够快。 DataInputStream 不如使用 NIO/ByteBuffer 高效,但相对较小的改进会增加工作量。
【讨论】:
对象序列化/反序列化是 java 中较重的东西之一。因此,如果这是程序的性能关键部分,那么避免对象序列化会有所帮助。尽管在许多情况下,瓶颈存在于其他地方,您最终可能会进行过早的优化。所以恕我直言,如果您不确定这将成为瓶颈,请使用 ObjectInputStream 并稍后进行优化。
【讨论】:
你为什么不写一些你想要的东西,围绕它进行一些测试,这样你就知道它是有效的。然后,如果它成为一个问题,您将能够用更快的东西替换实现,而无需大惊小怪。如果事实证明这不是问题,就像大多数这样的事情结果......那么你就不会花时间在不必要的事情上,也不会过早地进行优化。
Xstream 是相当好用的火这种东西,而且非常好用。
如果您的架构不是过于繁琐,您可能永远不需要优化这一点。
【讨论】: