1什么是对象的序列化和反序列化:就是将对象写入文件和从文件中读取出来的过程。
对象的序列化:ObjectOutputStream
代码示例:
1首先,我们把需要存储的对象,打一个标记,即Serializabale,只有对对象进行该操作后
才可以进行序列化和反序列化
2进行写入:
对象的反序列化:ObjectIntputStream
注意,使用时会有ClassNotFoundException异常,这个异常是指对象没有生成对应的class文件
代码实现:
package com.bed.ObjectStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ObjectInput {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("day06-code\\ObjectOut.txt"));
Object o = ois.readObject();
ois.close();
System.out.println(o);
}
知识点:transiant(瞬态)关键字。它的作用和static一样,被transiant修饰的变量不能进行
反序列化
知识点:InvalidClassException(序列化冲突)异常原理和解决方案
原理:每次序列化的时候Serializable接口都都会对Person.class文件打上一个序列号,而我们
改动类的内容的时候,就会改变原有的序列号,而反序列化读取的时候会比较序列化和
反序列化的编号是否一样,就会发生序列号不同造成的冲突。
解决方案:在类中自定义一个序列号即可(不让java自动生成序列号了)
如下写法即可:
案例:将多个对象进行序列化然后再进行反序列化。(注意其中的强转操作)
package com.bed.ObjectStream;
import java.io.*;
import java.util.ArrayList;
public class ObjectInandOut {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建一个数组用来存储Person类
ArrayList<Person1> al1=new ArrayList<>();
//向数组中添加数据。
al1.add(new Person1("bed1",19));
al1.add(new Person1("bed2",29));
al1.add(new Person1("bed3",39));
//将数组写入。序列化
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("day06-code\\InOut.txt"));
oos.writeObject(al1);
//进行反序列化。读取内容
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("day06-code\\InOut.txt"));
Object o = ois.readObject();
//将获得的o对象进行强转,转为ArraryList类型的数组
ArrayList<Person1> al2=(ArrayList<Person1>)o;
//遍历打印
for (Person1 person1 : al2) {
System.out.println(person1);
}
}
}