目录
一、序列化和反序列化流概念
序列化是也叫对象操作输出流(ObjectOutputStream),将java中的对象写到本地文件中
反序列化也叫对象操作输入流(ObjectInputStream),将文件中的对象读到程序当中
二、实例
将Student
类对象序列化到一个名为student.txt
的文本文件中,然后再通过文本文件反序列化成Student
类对象。
1、Student类
package csdn.IO;
import java.io.Serializable;
public class Student implements Serializable {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+" 年龄:"+this.age;
}
}
注意: 如果想让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的 。为了让某个类是可序列化的,该类可以通过实现Serializable接口,接口内没有具体方法。该接口是标识型接口,代表当前类是可序列化的。
2、进行序列化
package csdn.IO;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class ObjectOut {
public static void main(String[] args) {
//1、创建对象
Student stu=new Student("张三",19);
//2、序列化对象
ObjectOutputStream oos= null;
try {
oos = new ObjectOutputStream(new FileOutputStream("student.txt"));
} catch (IOException e) {
e.printStackTrace();
}
//3、写出数据
try {
oos.writeObject(stu);
} catch (IOException e) {
e.printStackTrace();
}
//4、关闭流
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、进行反序列化
package csdn.IO;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ObjectIn {
public static void main(String[] args){
ObjectInputStream ois= null;
try {
//1、创建反序列化流的对象
ois = new ObjectInputStream(new FileInputStream("student.txt"));
} catch (IOException e) {
e.printStackTrace();
}
Object o= null;
try {
o = ois.readObject();
//2、读取数据
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(o);
//3、打印对象
try {
ois.close();//4、关闭流
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
三、注意要点
- 使用序列化流将对象写到文件时,记得实现Serializable接口
- 写到文件中的数据不能修改,一旦修改无法读取
- 序列化对象后,想修改对象类的属性,为了不出现问题,需要给对象类添加序列号
如在之前的student类中添加地址
package csdn.IO;
import java.io.Serializable;
public class Student implements Serializable {
public final static long serialVersionUID=1L;
//固定序列号
private String name;
private int age;
private String address;
//添加了地址
public Student(){
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+" 年龄:"+this.age+" 地址:"+address;
}
}
- 对象中的某个成员变量不想被序列化,可以给该成员变量添加transient关键字修饰。
如在student类的age变量前添加transient关键字