java序列化(Serializable)
- 序列化:把对象转换为 字节(inputStream) 序列的过程称为对象的序列化。例:可以将一个对象转化为文件
- 反序列化:把 字节(outputStream) 序列恢复为对象的过程称为对象的反序列化。将文件还原成一个对象
使用场景
- 1.当你想把的内存中的对象状态保存到一个文件中或者数据库中时候(实现持久化)
- 2.RMI(remote message invoke)传输对象
- 3.使用套接字通过网络传输对象
实现代码
序列化
1.需要序列化的对象的类需要 实现serializable接口 -> 只是一个标记接口,指明这个类可以序列化
2.实例化ObjectOutputStream,调用writeObject()方法即可完成序列化
public class Test implements Serializable {
}
------------------------------
ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(new File("d:/test.txt")));
output .writeObject(test);
反序列化
其实际上是对序列化的反操作
1.通过ObjectInputStream实例调用readObject()方法,读取序列化的文件
2.将结果赋值给实现接口的类
ObjectInputStream input = new ObjectInputStream(new FileInputStream(new File("d:/test.txt")));
Test test= (Test ) input .readObject();
序列化保存的是对象网(深度复制),也就是该对象的所有的内容以及其引用和引用的引用都会包含。
Externalizable接口
Externalizable接口继承了serializable接口同时增添了俩个方法:writeExternal和readExternal,这俩个方法会在序列化和反序列化还原的过程中被自动调用以便执行一些特殊操作。
Externalizable接口可以实现自定义的序列化,通过调用 writeExternal() 和 readExternal() ,根据自己的需求序列化相应的字段。
反序列化过程:
对于serializable对象,对象完全以它存储的二进制位为基础来构造,而不调用构造器。对于一个Externalizable 对象,所有普通的默认构造器都会被调用(包括在字段定义时的初始化),然后调用readExternal方法----所有默认的构造器都会被调用,才能使Externalizable对象产生正确的行为。
writeExternal
默认构造器 -> readExternal
对于Externalizable有个替代方法
:实现Serialzable接口,并手动添加名为writeObject和readObject方法。这样一旦对象被序列化或者被反序列化还原,就会自动地分别调用这两个方法。也就是说只要提供这两个方法,就会使用它们而不是默认的序列化机制。
方法特征签名为(准确的):
private void writeObject(ObjectOutputStream stream) throw IOException
private void readObject(ObjectInputStream stream) throw IOException, ClassNotFoundException
transient关键字
当我们对序列化进行控制的时候,可能某个特定的子对象不想让java的序列化机制自动保存与恢复。那么可以使用transient修饰该子对象。其意思为 不用麻烦你保存或恢复数据-我自己会处理
static关键字
有一个理解说是:序列化是对象级别的,而static是类级别的,所以static修饰的成员属性也是不会被序列化的