java - 持久化的序列化缺点

标签 java multithreading serialization

http://docs.oracle.com/html/E24396_01/ejb3_overview_why.html 获取下面的给定文本

“序列化是Java的内置机制,用于将对象图转换为一系列字节,然后可以通过网络发送或存储在文件中。序列化非常易于使用,但也非常有限。它必须一次存储和检索整个对象图,这使得它不适合处理大量数据。 如果更新信息时发生错误,它无法撤消对对象所做的更改,这使得它不适合需要严格的数据完整性。多个线程或程序无法同时读写相同的序列化数据而不相互冲突。它不提供查询功能。所有这些因素使得序列化对于除了最琐碎的持久性需求之外的所有需求都毫无用处。”

我不清楚粗体文本。有人可以举一个例子来支持这一点吗?

最佳答案

这是一个愚蠢的观点,但这篇文章试图指出序列化并没有真正内置“事务”的概念。当您编写序列化对象图时,您将整个对象写入一个流,该流要么完全成功,要么失败,留下部分写入的流。同样的想法也适用于并发,两个不同的线程不能同时写入同一个流。

也就是说,您可以通过将图形写入新位置,然后在完成后将新字节交换到旧位置来“模拟”事务存储。但是,这也取决于数据的最终存放位置(存储位置的功能)。序列化本身并不是真正的持久化策略,因为它仍然需要在某个地方存储序列化的字节。对于“并发”点,也遵循相同的论点,因为您可以写入两个不同的位置,然后使用底层存储的原子性保证来处理并发问题。

还有其他更好的反对使用序列化进行长期存储的论点,即当应用程序的类随着时间的推移而发生变化时,保持向后兼容性会遇到困难。

关于java - 持久化的序列化缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12183280/

相关文章:

java - 在 Java 中检查对象是否为 null

node.js - 快速应用程序中的工作线程

asp.net - 序列化 ASP.NET 控件集合

java - Gson:java.lang.StackOverflowError: null

java - 使用 Maven 将 InstallerListener 添加到 IzPack 安装程序项目

java - org.eclipse.swt.SWTException : Failed to execute runnable (java. lang.NullPointerException)

java - 访问泛型类的静态方法

Android - 更改 Activity 时的多线程问题

python 3 time.sleep() "serial read"

java - 创建具有固定纵横比的自定义 JComponent