1 什么是序列化?
序列化:把对象以流的方式写入到文件中保存。与之相反的操作就是反序列化,就是把文件中保存的对象,以流的方式读取出来使用。
2 序列化与反序列
2.1 对象序列化:ObjectOutputStream
java.io.ObjectOutputStream:对象的序列化流 extends OutputStream。作用:把对象以流的方式写入到文件中保存
构造方法:
- ObjectOutputStream(OutputStream out) 初始化序列化输出流:参数是输出流的子类对象
共性方法: 字节输出流有的方法,它都有。
特有方法: 对象写入硬盘文件:writeObject(Object obj)
注意:
- 进行序列化和反序列化,必须要实现Serializable接口,标记当前接口可以被序列化或反序列化。
- 所有属性必须是可序列化的。如果不需要序列化,该属性必须注明是瞬态的,被transient关键字修饰
2.2 对象反序列化:ObjectInputStream
java.io.ObjectInputStream:对象的反序列化流 extends InputStream。作用:把文件中保存的对象以流的方式读取出来使用
构造方法: 初始化序列化输入流,参数字节输入流子类对象:ObjectInputStream(InputStream in)
特有方法: 读取硬盘文件中存储的对象数据 readObject()
注意:反序列化对象的类必须实现序列化接口
案例:将内存对象写入磁盘,再从磁盘将文件读入内存
/**
* 对象序列化流ObjectOutputStream
*
* 特有方法:对象写入硬盘文件:writeObject(Object obj)
*/
public class Demo23SerializableCollection {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.创建对象的序列化流,绑定文件保存对象的数据
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.txt"));
//2.向文件写入多个对象
oos.writeObject(new Person("张三", 12));
//3.关闭流
oos.close();
}
}
/**
* 对象反序列化流:ObjectInputStream
* 作用:将硬盘中序列化的对象,再次读取到内存中来
* 常用方法:字节流有什么,它就有什么。
* 特有方法:将对象读取到内存中来。readObject();
* 注意:
* 1.想进行对象的反序列化,必须实现序列化的接口
*
*/
public class Demo22Serializable {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//三步走:
//1.创建反序列化流的对象,绑定对象序列化问person.txt
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.txt"));
//2.通过流的方法读取对象,readObject()
Object o = ois.readObject();
//对象的数据类型是person的类型,可以进行强转
Person p = (Person) o;
System.out.println("p = " + p);//
//3.关闭流,释放资源
ois.close();
}
}
transient:瞬态关键字,被transient关键修饰的变量不能被序列化。
/**
* transient 瞬态关键字,作用声明当前属性不需要序列化!
*/
private transient int age;
public class Person implements Serializable {
//属性
private String name;
private int age;
//空参数构造
//满参数构造
//getter和setter方法
}
小结
了解更多Java面试相关资料,
请访问shimo.im/docs/N2A1MBV81dIeZ6AD/
相关文章
暂无评论...