目录
一、序列化流/对象操作输出流——ObjectOutputStream
二、反序列化流/对象操作输入流——ObjecInputStream
序列化流 ObjectOutputStream OutputStream
反序列化流 ObjecInputStream InputStream
一、序列化流/对象操作输出流——ObjectOutputStream
序列化流可以把Java对象写到本地文件中
注意:使用对象输出流将对象保存到文件时会出现NotSerializableException异常。所以输出的对象必须实现Serializable接口。
代码示例:
public class ObjectStreamDemo1 {
public static void main(String[] args) throws IOException {
// 需求:利用序列化流/对象操作输出流,把一个对象写到本地文件中
// 1.创建对象
Student student = new Student("张三", 25);
// 2.创建序列化流的对象/对象操作输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\a.txt"));
// 3.写出数据
oos.writeObject(student);
// 4.释放资源
oos.close();
}
}
/**
* Serializable接口里面是没有抽象方法,标记型接口
* 一旦实现了这个接口,就表示当前的Student类可以被序列化
* 理解:一个物品的合格证
*/
class Student implements Serializable {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
运行结果:
二、反序列化流/对象操作输入流——ObjecInputStream
可以把序列化到本地文件中的对象,读取到程序中来
代码实现:
public class ObjectStreamDemo2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 1.创建反序列化流的对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\a.txt"));
// 2.读取数据
Object readObject = ois.readObject();
// Student readObject = (Student)ois.readObject(); // 可以强转
// 3.打印对象
System.out.println(readObject);
// Student{name='张三', age=25}
// 4.释放资源
ois.close();
}
}
三、序列化流和反序列化流使用细节
1.Serializable接口
使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则,会出现NotSerializableException异常。
2.序列化后的文件不可修改
序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。
修改序列化后的文件:
再次执行反序列化代码:
会抛出StreamCorruptedException异常
3.serialVersionUID
当对象被序列化到本地文件后,如果继续修改类,反序列化会失败,原因是版本号不一样,需要将IDEA设置serialVersionUID
Student类就会生成一个版本号,修改Student类也能反序列化成功
如果不定义serialVersionUID,会抛出InvalidClassException异常
注意:版本号要最后定义,即在类定义完成后再定义版本号,因为版本号是根据当前类的成员生成的。
4.transient修饰的不能被序列化
如果一个对象中的某个成员变量的值不向北序列化,就需要给该成员变量添加transient关键字修饰,该关键字标记的成员变量不参与序列化过程。
四、用对象流读写多个对象
public class ObjectStreamDemo3 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
System.out.println("----------------序列化---------------");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\b.txt"));
ArrayList<Teacher> list = new ArrayList<>();
list.add(new Teacher("zhangsan", 23, "南京"));
list.add(new Teacher("lisi", 24, "北京"));
list.add(new Teacher("wangwu", 26, "重庆"));
oos.writeObject(list);
oos.close();
System.out.println("----------------反序列化---------------");
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("chapter18\\src\\com\\testdemo\\myobjectstream\\b.txt"));
ArrayList<Teacher> teachers = (ArrayList<Teacher>) ois.readObject();
for (Teacher teacher : teachers) {
System.out.println(teacher);
}
/**
* Teacher{name='zhangsan', age=23, address='南京'}
* Teacher{name='lisi', age=24, address='北京'}
* Teacher{name='wangwu', age=26, address='重庆'}
*/
ois.close();
}
}
class Teacher implements Serializable {
private static final long serialVersionUID = 6030696901056953191L;
private String name;
private int age;
private String address;
public Teacher(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
标签:name,对象,age,IO,new,JavaSE,序列化,String
From: https://blog.csdn.net/Helen_1997_1997/article/details/133683961