序列化流

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、把内存中的对象状态保存到一个文件中或者数据库中时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lemon20120331

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值