【问题标题】:Java Socket Programming: Send Object as CSV or Serialized Object?Java Socket 编程:将对象作为 CSV 或序列化对象发送?
【发布时间】:2014-10-05 15:25:38
【问题描述】:
我刚刚开始使用 Java 中的套接字编写网络代码。我只是在做一些测试程序。最初我打算将数据作为逗号分隔值发送,但我最近发现了 ObjectOutputStream。哪种方法更快或更有效的带宽?例如,如果我正在制作一个必须经常发送 x 和 y 坐标的游戏,我应该通过用逗号分隔的 PrintWriter 发送它,还是创建一个 Position 类并通过 ObjectOutputStream 发送一个实例。如果我更改代码并需要发送更多数据怎么办?
通过 PrintWriter 以 CSV 格式发送数据与通过 ObjectOutputStream 以对象中的字段形式发送数据的优缺点是什么?
【问题讨论】:
标签:
java
sockets
csv
network-programming
objectoutputstream
【解决方案1】:
ad-hoc 二进制格式很有可能比默认的序列化格式更节省带宽,默认的序列化格式应该是这样(但这是一个疯狂的猜测,它取决于数据的性质和数量:你应该 衡量它是否重要)或多或少的带宽效率比基于文本的格式。
但带宽效率并不是唯一重要的事情。
使用序列化,客户端和服务器必须用 Java 编写,并且在其类路径中具有序列化对象的类。如果您打算让客户使用任何语言编写,则不应考虑。
如果序列化没问题,那么将几乎所有 Java 对象转换为字节当然是一种非常简单的方法,这样您就可以避免定义格式。
请注意,有一些替代方案可以提供几乎相同的灵活性,但没有 Java 独有的序列化缺点。例如,JSON、XML 或 protobuf。
【解决方案2】:
我认为 CSV 更小。
如果要检查数据大小,请尝试输出到文件。
我不以其他原因向您推荐 ObjectOutputStream。
因为你必须保持对象的兼容性。
您是否研究过 serialize 和 serialVersionUID?
请查看java.io.Serializable