Java 序列化是一种将对象转换为字节流的过程,以便可以将对象保存到磁盘上,将其传输到网络上,或者将其存储在内存中,以后再进行反序列化,将字节流重新转换为对象。
序列化: 将对象的状态转换为字节流,以便可以将对象保存到文件、数据库或通过网络传输。
反序列化: 将字节流转换回对象,恢复对象的状态。
序列化
反序列化
Serializable 接口是 Java 中用于实现对象序列化的标记接口。它没有定义任何方法,仅用作标记,以便 Java 的序列化机制知道这个类的对象是可以序列化的。
当你序列化对象时,你把它包装成一个特殊文件,可以保存、传输或存储。反序列化则是打开这个文件,读取序列化的数据,然后将其还原为对象,以便在程序中使用。
序列化是一种用于保存、传输和还原对象的方法,它使得对象可以在不同的计算机之间移动和共享,这对于分布式系统、数据存储和跨平台通信非常有用。
serialVersionUID 自定义序列化版本号
serialVersionUID 是一个静态的、最终的(static final)长整型字段,用于标识类的版本。它在序列化和反序列化过程中起到版本控制的作用。
如果序列化类的版本不匹配,将会抛出InvalidClassException 异常。
当类的 serialVersionUID 修改为不同的值(如从 1L 改为 2L),然后再试图反序列化之前序列化的对象,将会抛出 InvalidClassException,说明类的版本不匹配,不能进行反序列化。
推荐手动定义 serialVersionUID,以避免版本不匹配的问题。
transient 关键字:
默认值: transient 字段在反序列化时的默认值是null
能用于实例字段,而不能用于类或者方法。
transient 关键字用于标记那些不应该被序列化的类字段。当对象被序列化时,transient 关键字修饰的字段不会被写入序列化流,也不会被反序列化。transient 关键字主要用于保护敏感数据或者当字段的状态不需要持久化时使用。
transient 关键字作用:
- 保护敏感数据: 不希望被序列化的字段,比如密码或者其他敏感信息。
- 避免序列化复杂字段: 某些字段可能是计算得出的或者是依赖于特定的运行时环境,不适合被序列化。
- 避免序列化临时数据: 不需要保存的临时数据或者缓存数据。
自定义序列化:
可以通过实现 writeObject 和 readObject 方法来自定义序列化过程。