前言
序列化对象,无非就是对对象的持久化存储。
序列化常用存取类:序列化类(ObjectOutputStream),反序列化类(ObjectInputStream)。
标记接口:Serializble
要序列化的类必须实现该接口,该接口没有任何方法和字段,仅用于标识可序列化的语句。
1. serialVersionUID 版本号
下面是JDK1.6中文文档的一段话:序列化时注意事项
2. 序列化注意事项
也就是说:在反序列化过程用于验证与目标类是否兼容。
比如:我对一个类进行序列化持久存储,此时我对此类添加或删除了某些属性重新编译,反序列化持久化对象时验证UID版本号发现不等,抛出InvalidClassException异常。
为什么强烈建议我们显示声明serialVersionUID值?因为在不同平台中的JVM虚拟机算法计算的serialVersionUID值可能略有不同,所以在跨平台的系统运行程序反序列化过程中可能抛出InvalidClassException异常。
序列化与反序化
先看常用构造,都是接收一个流
Test.java
package com.bin.demo;
import java.io.Serializable;
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public void setNmae(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "名字 = " + name + "、 年龄 = " + age;
}
}
main方法
//首先需要一个对象
Test t = new Test();
t.setNmae("超人");
t.setAge(2);
File file = new File("F:\\" + t.getClass().getSimpleName() + ".object"); //目的地
//序列化对象
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)); //输出流默认会创建目的并覆盖
out.writeObject(t); //写入对象
out.flush(); //刷新缓冲区
out.close();
//反序列化对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
if (file.exists()) { //只有文件存在才读取
Test t2 = (Test) in.readObject(); //读取对象并转换类型
System.out.println(t2.toString()); //输出内部数据
}
in.close();
输出:
名字 = 超人、 年龄 = 2
瞬态关键字:transient
短暂瞬间的意思:只能在内存中的生命,而不是持久化。
使用此关键字修饰的变量将在序列化过程中不进行持久化存储。同static静态关键字,也是在序列化过程中不进行持久化存储的。因为static静态的成员不可能出现在堆内存中,按照面向对象思想静态是属于类的,对象公有的。