我已经阅读了很多关于序列化的文章以及它如何如此好和伟大,但没有一个论据具有足够的说服力。我想知道是否有人真的可以告诉我通过序列化一个类我们真正可以实现什么?
原文由 m_a_khan 发布,翻译遵循 CC BY-SA 4.0 许可协议
我已经阅读了很多关于序列化的文章以及它如何如此好和伟大,但没有一个论据具有足够的说服力。我想知道是否有人真的可以告诉我通过序列化一个类我们真正可以实现什么?
原文由 m_a_khan 发布,翻译遵循 CC BY-SA 4.0 许可协议
当您运行应用程序时,它的所有对象都存储在内存 (RAM) 中。当您退出时,该内存会被操作系统回收,您的程序基本上会“忘记”它运行时发生的一切。序列化通过让您的应用程序将对象保存到磁盘来弥补这一点,以便它可以在下次启动时读回它们。如果您的应用程序要提供任何保存/共享先前状态的方式,您将需要某种形式的序列化。
原文由 Gordon Gustafson 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
让我们先定义序列化,然后我们才能讨论它为什么如此有用。
序列化只是将现有对象转换为字节数组。这个字节数组表示对象的类、对象的版本和对象的内部状态。然后可以在运行相同代码的 JVM 之间使用此字节数组来传输/读取对象。
我们为什么要这样做?
有几个原因:
通信:如果你有两台运行相同代码的机器,并且它们需要通信,一个简单的方法是一台机器用它想要传输的信息构建一个对象,然后将该对象序列化到另一台机器。这不是最好的沟通方式,但可以完成工作。
持久化:如果要将特定操作的状态存储在数据库中,可以很容易地将其序列化为字节数组,并存储在数据库中供以后检索。
深拷贝:如果你需要一个对象的 精确 副本,并且不想麻烦自己编写专门的 clone() 类,只需将对象序列化为一个字节数组,然后将其反序列化为另一个对象实现了这个目标。
缓存:实际上只是上述的一个应用程序,但有时构建一个对象需要 10 分钟,但反序列化只需要 10 秒。因此,与其保留内存中的巨型对象,不如通过序列化将其缓存到文件中,并在以后需要时读取它。
Cross JVM Synchronization:序列化可以跨不同的 JVM 工作,这些 JVM 可能运行在不同的架构上。