大多数商业项目使用数据库或内存映射文件或仅使用普通文件来满足持久性要求。 只有少数项目依赖Java中的序列化过程。 无论如何,本文都不是Java序列化教程,也不是如何在Java中序列化对象,而是采访有关序列化机制和序列化API的问题。对于不熟悉java序列化的人,java序列化是用于通过将对象的状态存储在扩展名为.ser的文件中来序列化java中的对象的过程,并且可以通过此文件状态还原和重建Java对象。 ,此反向过程称为反序列化。
那么什么是Java序列化?序列化是将对象更改为二进制格式的过程,该二进制格式可以通过网络保存到磁盘或发送给其他正在运行的Java虚拟机,并且可以通过反序列化来恢复对象的状态。 Java序列化API通过java.io.Serializable和java.io.Externalizable接口为开发人员提供了标准的机制,ObjectInputStream和ObjectOutputStream处理对象序列化。 Java程序员可以根据类结构或其自定义二进制格式自由选择标准序列化,通常将后者视为后者。这是最佳做法,因为序列化的二进制文件格式已成为类输出API的一部分,这可能会破坏封装 Java中私有和包可见的属性的集合。
我们又该怎么去序列化?让Java 中的类可以序列化很简单. 你的 Java 类只需要实现 java.io.Serializable 接口, JVM 就会把 Object 对象按默认格式序列化. 让一个类是可序列化的需要有意为之. 类可序列会可能为是一个长期代价, 可能会因此而限制你修改或改变其实现. 当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。序列化如何限制你更改类的能力的一个示例是 SerialVersionUID。
如果不显式声明 SerialVersionUID, 则 JVM 会根据类结构生成其结构, 该结构依赖于类实现接口和可能更改的其他几个因素。假设你新版本的类文件实现的另一个接口, JVM 将生成一个不同的 SerialVersionUID 的, 当你尝试加载旧版本的程序序列化的旧对象时, 你将获得无效类异常 InvalidClassException。