序列化流
ObjectOutputStream 序列化流/对象操作输出流
包装基本流,属于字节流的一种,负责输出数据。可以把Java中的对象写到本地文件中去。
构造方法:
public ObjectOutputStream(OutputStream out)把基本流包装成高级流
成员方法:
public final void writeObject(Object obj)把对象序列化(写出)到文件中去
序列化流的小细节:使用对象输出流将对象保存到文件时会出现NotSerializableException异常
解决方案:需要让Javabean类实现Serializable接口。Serializable接口里面是没有抽象方法,是标记型接口,一旦实现了这个接口,那么就表示当前的Javabean类可以被序列化。
public class ObjectStreamDemo1 { public static void main(String[] args) throws IOException { /* 需求: 利用序列化流/对象操作输出流,把一个对象写到本地文件中 构造方法: public ObjectOutputStream(OutputStream out) 把基本流变成高级流 成员方法: public final void writeObject(Object obj) 把对象序列化(写出)到文件中去 */ //1.创建对象 Student stu = new Student("zhangsan",23); //2.创建序列化流的对象/对象操作输出流 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myio\\a.txt")); //3.写出数据 oos.writeObject(stu); //4.释放资源 oos.close(); } }
Javabean类:
/* * * Serializable接口里面是没有抽象方法,标记型接口 * 一旦实现了这个接口,那么就表示当前的Student类可以被序列化 * 理解: * 一个物品的合格证 * */ 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; } /** * 获取 * @return name */ public String getName() { return name; } /** * 设置 * @param name */ public void setName(String name) { this.name = name; } /** * 获取 * @return age */ public int getAge() { return age; } /** * 设置 * @param age */ public void setAge(int age) { this.age = age; } public String toString() { return "Student{name = " + name + ", age = " + age + "}"; } }
反序列化流
ObjectInputStream 反序列化流/对象操作输入流
可以把序列化到本地文件中的对象,读取到程序中来。
构造方法:
public ObjectInputStream(InputStream out)把基本流变成高级流
public Object readObject()把序列化到本地文件中的对象,读取到程序中来
public class ObjectStreamDemo2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
/*
需求:
利用反序列化流/对象操作输入流,把文件中中的对象读到程序当中
构造方法:
public ObjectInputStream(InputStream out) 把基本流变成高级流
成员方法:
public Object readObject() 把序列化到本地文件中的对象,读取到程序中来
*/
//1.创建反序列化流的对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myio\\a.txt"));
//2.读取数据
// Object o = ois.readObject();
Student o = (Student) ois.readObject();
//3.打印对象
System.out.println(o);
//4.释放资源
ois.close();
}
}
序列化流/反序列化流的细节汇总
1、使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则,会出现NotSerializableException异常。
2、序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。
3、序列化对象后,修改了Javabean类,再次反序列化,会不会有问题?
会,报InvalidClassException异常,因为文件中的版本号,跟Javabean中的版本号不匹配。
解决方法:给Javabean类添加 serialVersionUID(序列号、版本号)
方法1:手动添加
private static final long serialVersionUID=1L;
方法2:idea设置以下选项
可以自动生成版本号,点击类名Alt+Enter选择以下选项
4、如果一个对象中的某个成员变量的值不想被序列化,如何实现?
解决方案:
给该成员变量加 transient 瞬态关键字修饰,该关键字标记的成员变量不参与序列化过程