序列化与反序列化
序列化利用ObjectOutputStream将内存的对象写入硬盘中
反序列化利用ObjectInputStream将硬盘的对象读到内存中
可序列化的类必须实现Serializable接口
接口源码:
public interface Serializable {
}
可见接口中并没有任何抽象方法,所以它是一个标识性接口。
在可序列化的类中,应该尽量手动定义SerialVersionUID
如果没有定义,jvm在运行的过程中会自动给这个类分配一个SerialVersionUID
但是这样的话,每当你改动这个类,这个类未改动之前的已经序列化好的对象就会无法反序列化出来
因为改动过这个类,jvm给这个类从新分配了一个SerialVersionUID,以前序列化好的对象凭借之前旧的SerialVersionUID
无法识别当前的类,所以会报错,无法反序列化出来
所以类中还是应该自己定义一个SerialVersionUID
实例
package com.mytest.ObjectIO;
import java.io.*;
public class ObjectOutputStreamTest {
public static void main(String[] args) {
User user = new User(18,"zhangsan");
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
//确定文件源,打开输入输出流
oos = new ObjectOutputStream(new FileOutputStream("D:\java_test\src\com\mytest\User01"));
ois = new ObjectInputStream(new FileInputStream("D:\java_test\src\com\mytest\User01"));
oos.writeObject(user); //序列化
try {
User object = (User)ois.readObject(); //反序列化
System.out.println(object.name);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
oos.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
oos.close(); //关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//定义可序列化的类
class User implements Serializable {
private static final long serialVersionUID = 1L;
int age;
String name;
public User(int age,String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}