一、概念
序列化:把对象序列化后保存到磁盘中;
反序列化:把序列化的对象从磁盘中恢复出来;
二、如何序列化/反序列化
序列化:创建ObjectOutputStream对象,调用writeObject();
反序列化:创建ObjectIutputStream对象,调用readObject();
三、准备测试类,用来序列化和反序列化
package cn.tedu;
import java.io.Serializable;
/**本类用于序列化*/
public class test implements Serializable {
int age = 18;
String name = "爸爸";
String field = "帅气";
public void get(){
System.out.println("嗨害");
}
@Override
public String toString() {
return "test{" +
"age=" + age +
", name='" + name + '\'' +
", field='" + field + '\'' +
'}';
}
}
四、开始序列化和反序列化
package cn.tedu;
import java.io.*;
/**本类用于复习序列化和反序列化*/
public class ReviewSerializable {
public static void main(String[] args) {
// method();//本方法用于序列化
method2();//本方法用于反序列化
}
private static void method2() {
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(
new FileInputStream("D:\\a\\1.txt"));
Object o = objectInputStream.readObject();
System.out.println(o);
System.out.println("反序列化成功");
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void method() {
test test = new test();
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(
new FileOutputStream("D:\\a\\1.txt"));
objectOutputStream.writeObject(test);
System.out.println("序列化成功");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
五、注意事项
1、测试类:需要在测试类中重写toString(),否则输出的结果是toString()的默认实现方式(返回对象的包名.类名.@十六进制的哈希码值)
2、可能出现的异常:
(1)、NotserializableException:没有在测试类中实现Serializable接口
(2)、invalidclassException:两次UID的值不一样
(2.1)、解决方案:
1、一次序列化对应一次反序列化;
2、将UID值写死 (private static final long serialVersionUID = 1L);
3、序列化后不改变测试类中的内容