【问题标题】:Serialization vs toString()序列化与 toString()
【发布时间】:2021-08-23 10:55:03
【问题描述】:

由于我正在从文件中写入/读取,我想知道直接发送对象或将它们的表示形式用作文件上的字符串之间是否有任何区别或任何最佳实践,就我个人而言,我个人觉得更容易处理。

那么我什么时候应该序列化而不是将对象作为字符串写入/读取?

【问题讨论】:

  • 将对象作为字符串写入/读取序列化。
  • “任何区别......直接发送对象或使用它们的表示作为字符串”最明显的区别是Java提供了内置功能来读回序列化数据。你必须工作了解如何自己解析toString() 输出。

标签: java serialization tostring


【解决方案1】:

在一个对象的字符串表示中通常没有足够的信息来重新创建它。

Java 序列化“正常工作”,但不会为您提供人类可读的表示,如果您正在寻找的话。

另一种选择是读取/写入对象的 JSON 表示。有几个流行的 Java JSON 序列化/联邦化库,包括 GSon 和 Jackson。

【讨论】:

  • …但没有给你一个人类可读的表示…如果你使用XMLEncoder
  • @g00se:XMLEncoder 不是 O.P. 询问的 Object.toString()。 XMLEncoder 大致相当于序列化为 JSON,我提到过,但可以说是不那么可读。
  • 当然,OP 询问的是 both toString and 序列化。我的观点很简单:序列化完全有可能是人类可读的。个人认为xml比json可读性强,但是里面的内容不多。另外,这将取决于 JSON 实现
【解决方案2】:

答案在javadoc for Object.toString()

返回对象的字符串表示形式。通常,toString 方法返回一个“以文本方式表示”该对象的字符串。结果应该是一个简洁但信息丰富的表示,易于人们阅读。

注意上面写着:

  • 简洁,
  • 内容丰富,并且
  • 易于阅读。

但它没有说:

  • 完成,
  • 明确,或
  • 便于计算机阅读。

序列化是关于生成一种线性(不一定是文本)形式,可以计算机读取并用于重建原始对象的状态。

因此,典型的序列化并不是特别可读(例如 JSON、XML、YAML)或完全不可读(例如 Java 对象序列化、ASN.1)。但另一方面是重建对象所需的信息都应该以明确的形式存在。

(关于各种类型的序列化、它们的属性和实用性还有很多可以说的。但是,这超出了您的问题范围。)


这是否会阻止 toString() 用于序列化数据?

不,它没有。

但是,如果您采用这种方法,则需要仔细编码您的 toString() 方法,以确保它们产生的内容是完整且明确的。然后你需要编写一个相应的方法来解析toString()的输出并从中创建一个新对象。


... 或将它们的表示形式用作文件中的字符串,就我个人而言,我觉得它更容易处理。

我认为,当您编写更大、更复杂的程序时,您将进入那种编写、测试和维护代码繁琐且耗时的阶段。

【讨论】:

    【解决方案3】:

    序列化允许您将对象的状态转换为字节流,然后可以将其保存到本地磁盘上的文件中,通过网络发送到任何其他机器,或保存到数据库中。反序列化允许您反转该过程,这意味着将序列化的字节流再次重新转换为对象。重要的是要知道数字或其他类型不像字符串那样容易写入文件或处理。但是,它们的初始状态不保证不会被序列化。

    因此,使用字符串很方便,对于更简单的情况,序列化不一定重要,例如大学项目。但是,不建议进行此过程,因为还有其他更好的解决方案。

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2015-10-12
      • 2010-12-02
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多