Java 用于持久性的序列化

Java 用于持久性的序列化,java,multithreading,serialization,Java,Multithreading,Serialization,从以下给定文本中获取 序列化是Java的内置机制,用于将对象图转换为一系列字节,然后通过网络发送或存储在文件中。序列化非常容易使用,但也非常有限。它必须一次存储和检索整个对象图,因此不适合处理大量数据如果在更新信息时发生错误,则无法撤消对对象所做的更改,从而使其不适用于需要严格数据完整性的应用程序。多个线程或程序不能同时读写相同的序列化数据,而不会相互冲突。它不提供查询功能。所有这些因素使得序列化对于除最琐碎的持久性需求之外的所有需求都毫无用处。” 我不清楚粗体的文本。有人能举个例子来支持这一点

从以下给定文本中获取

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


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

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

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


还有其他更好的理由反对将序列化用于长期存储,即当应用程序的类随时间变化时,在维护向后兼容性方面存在困难。

我支持您编写的大多数内容。本文中的多线程冲突是否意味着它不像JDBC那样具有任何读写锁定机制,因此多个程序/线程对同一底层持久存储进行写/读是不合适的?@user1633905-正如我在回答中试图解释的,序列化本身并不是一个(完整的)问题持久性机制,因为您仍然需要一些持久性存储位置来存储生成的字节。持久性存储提供的锁定机制与序列化本身完全正交。是的,我现在明白了,它只是将java对象转换为流,没有自己的API真正支持事务/隔离行为。这将是要确保的持久性存储任务。