序列化:将对象按照流的方式存储到文本文件中或者再网络中传输
对象---->流数据 序列化流 (ObjectOutputStream)
反序列化:将文本文件中的流对象或者网络传输中的流对象还原成对象
流数据--->对象 反序列化流(ObjectInputStream)
关键字:transient 修饰属性,这个属性就不会被序列化
注意:
1)必须序列化之后才可以反序列化2)自定义类要实现序列化功能,必须实现接口Serializable(标记接口),如果没有实现就会报这个错误NotSerializableException。
public class Person implements Serializable{
//产生随机的固定Id
private static final long serialVersionUID = 3929786557947102117L;
transient int age ;//这样这个类的属性就不会被序列化
………
@Override
public String toString() { //为了打印出来不是地址值
return "Person [name=" + name + ", age=" + age + "]";
}
}
3)如果一个类序列化之后,修改了这个类的成员变量,再反序列化,则会报错InvalidClassException,一般情况下这个错误出现的原因:是该类的序列版本号与从流中读取的类描述符的版本号不匹配。
解决办法:让当前实现类序列化功能的这个类产生一个固定ID,类名会有黄色警告线,直接就点它固定Id
程序示例:
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
write() ;
read();
}
// 反序列化
private static void read() throws FileNotFoundException, IOException, ClassNotFoundException {
//创建反序列化流对象
public ObjectInputStream(InputStream in)
ObjectInputStream in = new ObjectInputStream(new FileInputStream("oos.txt")) ;
//读
public final Object readObject():从 ObjectInputStream 读取对象。
Object obj = in.readObject() ;
in.close();
System.out.println(obj);//Person [name=高圆圆, age=27]
}
//序列化
private static void write() throws FileNotFoundException, IOException {
//创建一个序列化流对象
//public ObjectOutputStream(OutputStream out)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt")) ;
//创建一个Person类对象
Person p = new Person("高圆圆", 27) ;
//public final void writeObject(Object obj)
oos.writeObject(p);
//关闭资源
oos.close();
}