序列化流
序列化流
- 序列化流:可以把Java中的对象写道本地文件当中(并不是原文,而是加密的不容易改变的)
构造方法:
public ObjectOutputStream(OutputStream out) 把基本流写成高级流
成员方法:
piblic final void writeObject(Object obj) 把对象序列化(写出)到文件中去
package io流;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class xuliehua {
public static void main(String[] args) throws IOException {
/*
需求:
利用序列化/对象操作输出,把一个对象写道本地文件中
构造方法:
public ObjectOutputStream(OutputStream out) 把基本流写成高级流
成员方法:
piblic final void writeObject(Object obj) 把对象序列化(写出)到文件中去
*/
//1.创建对象
Student stu = new Student("zhangsan",23);
//2.创建序列化流的对象/对象输出操作流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\code\\练习文件\\xuliehua.txt"));
//3.写出数据
oos.writeObject(stu);
//4.释放资源
oos.close();
}
}
-
小细节:使用输出流将对象保存到文件时会出现NotSerializableRxceptions异常
-
解决方案需要让Javabean类实现Serializable接口
-
package io流; import java.io.Serializable; /* * * Serializable接口里没有抽象方法,标记型接口 * 一旦实现了这个接口,那么就表示当前Student类可以被序列化 * * */ public class Student implements Serializable { private static final long serialVersionUID = 123456L; private String name; private int age; public Student(){} public Student(String name,int age) { this.name=name; this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
反序列化
-
对象操作输入流:可以把序列化到本地文件中的对象,读到程序中来
-
package io流; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class fanxuliehua { public static void main(String[] args) throws IOException, ClassNotFoundException { /** * 需求:利用反序列化、对象操作输入流,把文件中中的对象读到程序当中 * 构造方法:public ObjectInputStream(InputStream out 把基本流变成高级流 * 成员方法:public Object readObject() 把序列化到本地文件中的对象,读取到程序中来 * */ //1.创建反序列化对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\code\\练习文件\\xuliehua.txt")); //2.读取数据 Student o = (Student) ois.readObject(); //3.打印对象 System.out.println(o); //4.释放资源 ois.close(); } }
兼容问题
-
使用序列化流将对象写到文件时,需要让Javabean类实现Serializale接口,标记型接口,否则会出现上文所说异常
-
序列化流写到文件中的数据时不能修改的,一旦修改就无法再次读回来了
-
序列化对象后,修改了Javabean类,再次反序列化,会不会有问题
答:会出问题,会抛出InvalidClassException异常
-
遇到Java反序列化
InvalidClassException的通用解决方法如下步骤 操作内容 说明 显式声明 serialVersionUID在实现 Serializable的类中,添加固定的serialVersionUID(如private static final long serialVersionUID = 1L;),确保序列化和反序列化时类版本标识一致。,确保序列化和反序列化时类版本标识一致。 保持类结构一致 序列化和反序列化阶段, Serializable类的属性、方法、继承关系等结构需若类结构有修改,需重新生成序列化文件后再进行反序列化若类结构有修改,需重新生成序列化文件后再进行反序列化 重新生成序列化文件 若类结构或 serialVersionUID发生变更,删除旧的序列化文件,重新执行序列化代码生成新文件,再进行反序列化操作。例如:
public class Student implements Serializable { private static final long serialVersionUID = 1L; // 自定义一个固定值 // 类的其他属性和方法 }

浙公网安备 33010602011771号