1.什么是序列化流
序列化流,就是操作对象的流
分类:
序列化流: 对象的输出流,写对象
反序列化流: 对象的输入流,读对象
2.ObjectOutputStream的介绍和使用
对象的字节输出流,写对象
- 构造方法
public ObjectOutputStream(OutputStream out);
- 序列化操作的前提
被序列化的那个类必须实现java.io.Serializable接口,开启序列化功能
根接口没有任何方法,这种接口我们称为标记接口!!
- 序列化操作
public class ObjectOutputStreamDemo {
public static void main(String[] args) throws IOException {
//1.创建ObjectOutputStream对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("1.txt"));
//2.写对象
Dog dd = new Dog(2,"旺财");
oos.writeObject(dd);//NotSerializableException
//3.释放资源
oos.close();
}
}
3.ObjectInputStream的介绍和使用
对象的输入流,读对象!
- 构造方法
public ObjectInputStream(InputStream in);
- 反序列操作
public class ObjectInputStreamDemo {
public static void main(String[] args) throws Exception {
//1.创建ObjectInputStream对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("1.txt"));
//2.读对象
Object obj = ois.readObject();
System.out.println(obj);
//3.释放资源
ois.close();
}
}
4.反序列化操作的两种异常演示
a.ClassNotFoundException 找不到类异常
原因: 序列化之后,将被序列化的类删除了,然后进行反序列化即可出现这个异常
b.InvalidClassException 无效类异常
原因:序列化之后,将被序列化的类进行修改,然后进行反序列化即可出现这个异常
扩展:反序列化流如何判断类是否有效呢???
通过serialVersionUID(序列化版本号)来判断,而serialVersionUID通过类的成员内容计算而来的
也就是只要类的内容没变,那么版本号也不会改变,只要内容改变那么版本号也会跟着改变!
5.练习:如果需要序列化多个对象怎么操作?
需求:要向文件中序列化多个对象
public class TestDemo {
public static void main(String[] args) throws Exception {
readArrayList();
}
public static void readArrayList() throws Exception {
//1.反序列化流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("dogs.txt"));
//2.读对象
ArrayList<Dog> arrayList = (ArrayList<Dog>)ois.readObject();
for (Dog dog : arrayList) {
System.out.println(dog);
}
//3.释放资源
ois.close();
}
public static void writeArrayList() throws IOException {
//需求:要向文件中序列化多个对象
//方案:创建一个容器,将要序列化的所有对象保存到这个容器中
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("dogs.txt"));
ArrayList<Dog> dogs = new ArrayList<Dog>();
dogs.add(new Dog("旺小财",1,4));
dogs.add(new Dog("旺中财",2,3));
dogs.add(new Dog("旺大财",3,5));
dogs.add(new Dog("旺老财",4,4));
//把这个集合当做一个对象
oos.writeObject(dogs);
oos.close();
}
}
注意:多个对象的话,保证只写一次,才能正确读出来
6.Java序列化的意义:
1、将对象或者异常等写入文件,通过文件传输信息。
2、将对象或者异常通过网络进行传输。
3、把内存中的对象状态保存到一个文件中或者数据库中时。