对象序列化机制:
对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。
对象序列化的条件:
1、实现Serializable;
2、定义全局常量private static final long serialVersionUID;
3、除了当前Person类需要实现Serializable接口之外,还必须保证其内部所有属性也都是可序列化的;(默认情况下,基本数据类型可序列化)
4、类中定义的用static和transient修饰的变量不能被序列化。
serialVersionUID的作用:
Java的序列化机制是通过在运行时判断字节流中的 serialVersionUID与本地相应实体类的serialVersionUID来验证该类版本的一致性的;
如果没有显示定义serialVersionUID,则程序会自动生成一个serialVersionUID,序列化后到反序列化前期间如果对类做了修改,那么会导致本地相应的实体类的serialVersionUID发生变化,从而与字节流中的 serialVersionUID不相同;
在进行反序列化时,JVM会把传来的字节流中的 serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException)
对象流:ObjectInputStream和OjbectOutputSteam
用于存储和读取基本数据类型数据或对象的处理流,它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
- 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制;
- 反序列化:用ObjectInputStream类读取基本类型数据或对象的机制;
- ObjectOutputStream和ObjectInputStream同样不能序列化static和transient修饰的成员变量。
例:
将下面的实体类用对象流实现序列化与反序列化:
class Person implements Serializable{
private static final long serialVersionUID = 1231242L;
private String name;
private int age;
private String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
//此处省略get/set方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
ObjectOutputStream测试类:
package cn.jingpengchong.io;
import java.io.*;
public class ObjectStreamTest {
public static void main(String[] args) {
testObjectOutputStream();
}
private static void testObjectOutputStream() {
ObjectOutputStream output = null;
try {
output = new ObjectOutputStream(new FileOutputStream("object.dat"));
output.writeObject(new Person("孙悟空",520,"男"));
//将缓存区的数据刷新到输出流中
output.flush();
System.out.println("操作成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
if(output != null){
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果如下:
ObjectInputStream测试类:
package cn.jingpengchong.io;
import java.io.*;
public class ObjectStreamTest {
public static void main(String[] args) {
testObjectInputStream();
}
private static void testObjectInputStream() {
ObjectInputStream input = null;
try {
input = new ObjectInputStream(new FileInputStream("object.dat"));
Person per = (Person)input.readObject();
System.out.println(per);
} catch (Exception e){
e.printStackTrace();
} finally {
if(input != null){
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果如下: