序列化Serializable

1.什么是 序列化 ( Serializable )

对象的寿命通常随着生成该对象的程序块的终止而终止。
有时候,需要将对象的状态保存下来,在需要时再将对象恢复(反序列化)。

我们把对象的这种能记录自己的状态以便将来再生的能力,叫做对象的持久性 ( persistence )。

对象通过写出描述自己状态的数值来记录自己,这个过程就叫对象的序列化 ( Serialization ) 。

任何类型只要实现了Serializable接口,就可以被保存到文件中,
或者作为数据流通过网络发送到别的地方。
也可以用管道来传输到系统的其他程序中

2.java.io.Serializable 接口

类可以通过实现 java.io.Serializable 接口来启用其序列化功能。

这个序列化接口没有任何方法和域,仅用于标识序列化的语意。

Object serialization 允许你将实现了Serializable接口的对象转换为字节序列,
这些字节序列可以被完全存储以备以后重新生成原来的对象。
它自动屏蔽了操作系统的差异,比如,在Window平台生成一个对象并序列化,
通过网络传到一台Unix机器上,就可以在这台Unix机器上正确地重构这个对象。

Java语言里现在只支持lightweight persistence,就是轻量级持久化,
这是通过serialization机制来实现的。
persistence是指一个对象的生命周期不由程序是否执行来决定,即使是在程序终止时这个对象也存在。
它把一个serializable的对象写到磁盘(本机或其他机器上的非RAM存储器),
并在程序重新调用时再读取对象到通常的RAM存储器。


3. 什么情况下需要序列化

1)当你想把的内存中的对象写入到硬盘的时候。

比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,
等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。

2)当你想用套接字在网络上传送对象的时候。

3)当你想通过RMI传输对象的时候。

4.serialVersionUID

序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,

该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。

如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致失败并抛出 InvalidClassException。

可序列化类可以通过声明名为 "serialVersionUID" 的字段(

该字段必须是静态 (static)、最终 (final) 的 long 型字段)

显式声明其自己的 serialVersionUID

例如:

private static final long serialVersionUID = 5231134212346077681L;

默认的 serialVersionUID 对类的详细信息具有较高的敏感性,
为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,
序列化类必须声明一个明确的 serialVersionUID 值,
这样在反序列化过程中就会避免导致意外的 InvalidClassException。

原文地址:https://www.cnblogs.com/wuxinyan/p/10448314.html