• 第十章、序列化流

  • 序列化流和反序列化流概述

    • 序列化:用一个字节序列表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等等信息。字节序列写出到文件后,相当于文件中持久保存了一个对象的信息。

    • 反序列话:从文件中将字节序列读取回来,重构对象。

    • 序列化与反序列化图示1:

    • 序列化与反序列化图示2:

  • Serializable

    • 序列化和反序列化的时候,会抛出NotSerializableException,没有序列化异常。

    • 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。

    • Serializable接口也叫标记型接口。类实现了Serializable接口就会给类添加一个标记,要进行序列化和反序列化的时候,就会检测类上是否有这个标记。有则可以进行序列化或反序列化;没有则会抛出 NotSerializableException 异常。

  • static

    • 静态优先于非静态加载到内存中(静态优先于对象进入内存中)

    • 被static修饰的成员变量不能被序列化,序列化的都是对象。如 private static int age; oos.writeObject(new Person("小美女",18));

      • 序列化得到的是:Person{name='小美女', age=0}

  • transient

    • 瞬态关键字。

    • 被transient修饰的成员变量,不能被序列化。 private transient int age; oos.writeObject(new Person("小美女",18));

      • 序列化得到是:Person{name='小美女', age=0}

  • 对象的序列化

    • 概述:java.io.ObjectOutputStream extends OutputStream

    • 构造方法

      • ObjectOutputStream(OutputStream out ):创建写入指定os的oos

      • os,字节输出流。

    • 特有的成员方法:

      • void writeObject(Object obj):将指定的对象写入oos中。

    • 使用步骤:

      1. 创建oos对象,构造方法中传递字节输出流;

      2. 使用oos对象中的方法writeObject,把对象写入到文件中;

      3. 释放资源。

    • 代码示意:

1 public class Person implements Serializable{
2 private static final long serialVersionUID = 1L;
3 private String name;
4 private int age;
5 get...set..
6 toString...
7 }
1 //1.创建ObjectOutputStream对象,构造方法中传递字节输出流
2 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("10_IO\\person.txt"));
3 //2.使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中
4 oos.writeObject(new Person("小美女",18));
5 //3.释放资源
6 oos.close();
  • 对象的反序列化:

    • 概述:java.io.ObjectInputStream extends InputStream

    • 构造方法:

      • ObjectInputStream(InputStream in):创建从指定in读取的ois对象。

    • 特有的成员方法:

      • Object readObject() :从ois中读取对象。

    • 使用步骤:

      1. 创建ois对象,构造方法中传递字节输入流;

      2. 使用ois对象中的方法readObject读取保存对象的文件;

      3. 释放资源;

      4. 处理读取到的对象。

    • 注意:readObject方法声明抛出了 ClassNotFoundException(class文件找不到异常)。

    • 反序列化的前提:

      • 类必须实现Serializable。

      • 必须存在类对应的class文件。

    • 代码示意:

 1 public static void main(String[] args) throws IOException, ClassNotFoundException {
2 //1.创建ObjectInputStream对象,构造方法中传递字节输入流
3 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("10_IO\\person.txt"));
4 //2.使用ObjectInputStream对象中的方法readObject读取保存对象的文件
5 Object o = ois.readObject();
6 //3.释放资源
7 ois.close();
8 //4.使用读取出来的对象(打印)
9 System.out.println(o);
10 Person p = (Person)o;
11 System.out.println(p.getName()+p.getAge());
12 }
 
  • InvalidClassExcepton异常原理,如下示意图:

  • 序列化集合

    • 题目描述:序列化集合。当想要在文件中保存多个对象的时候,可以把多个对象存储到一个集合中。对集合进行序列化和反序列化操作。

    • 步骤分析:

      1. 定义一个存储Person对象的ArrayList集合;

      2. 往ArrayList集合中存储Person对象;

      3. 创建一个序列化流oos对象

      4. 使用oos对象中方法writeObject,对集合进行序列化;

      5. 创建一个反序列化ois对象;

      6. 使用ois对象中的方法readObject读取文件中保存的集合;

      7. 把Object类型的集合转换为ArrayList类型;

      8. 遍历ArrayList集合;

      9. 释放资源。

    • 代码实现:

  •  1 public static void main(String[] args) throws IOException, ClassNotFoundException {
    2 //1.定义一个存储Person对象的ArrayList集合
    3 ArrayList<Person> list = new ArrayList<>();
    4 //2.往ArrayList集合中存储Person对象
    5 list.add(new Person("张三",18));
    6 list.add(new Person("李四",19));
    7 list.add(new Person("王五",20));
    8 //3.创建一个序列化流ObjectOutputStream对象
    9 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("10_IO\\list.txt"));
    10 //4.使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化
    11 oos.writeObject(list);
    12 //5.创建一个反序列化ObjectInputStream对象
    13 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("10_IO\\list.txt"));
    14 //6.使用ObjectInputStream对象中的方法readObject读取文件中保存的集合
    15 Object o = ois.readObject();
    16 //7.把Object类型的集合转换为ArrayList类型
    17 ArrayList<Person> list2 = (ArrayList<Person>)o;
    18 //8.遍历ArrayList集合
    19 for (Person p : list2) {
    20 System.out.println(p);
    21 }
    22 //9.释放资源
    23 ois.close();
    24 oos.close();
    25 }

File类与常用IO流第十章——序列化流的更多相关文章

  1. File类与常用IO流第四章——IO字节流

    一切文件在存储时,都是以二进制数字的形式保存的,都是一个一个字节.无论使用什么样的流对象,底层传输的始终是二进制数据. 字节输出流 OutputStream java.io.OutputStream ...

  2. File类与常用IO流第一章File类

    第一章:File类 一.1个重点单词: file:文件:directory:文件夹/目录:path:路径(绝对路径:absolutePath) 二.4个静态成员变量: 1.static String ...

  3. File类与常用IO流第八章——缓冲流

    第八章.缓冲流 缓冲流概述 缓冲流,也叫高效流,是对4个基本的FileXxx流的增强.按照数据类型分为4类:   输入缓冲流 输出缓冲流 字节缓冲流 BufferedInputStream Buffe ...

  4. File类与常用IO流第七章——Properties集合

    Properties概述 java.util.Properties extends Hashtable<k,v> implements Map<k,v> Properties类 ...

  5. File类与常用IO流第二章过滤器

    在第一章中,有一个练习使用递归搜索文件 1 public static void main(String[] args) { 2 File f=new File("E:\\aaa" ...

  6. File类与常用IO流第九章——转换流

    第九章.转换流 字节编码和字符集 编码:按照某种规则将字符以二进制存储到计算机中. 解码:将存储在计算机中的二进制数按照某种规则解析显示出来. 字符编码:Character Encoding ,就是一 ...

  7. File类与常用IO流第十一章——打印流

    第十一章.打印流 概述:java.io.PrintStream extends OutputStream,为其他输出流添加了功能,使题目能够方便的打印各种数据值表示形式. 特点: 只负责数据的输出,不 ...

  8. File类与常用IO流第五章——IO字符流

    字符流,只能操作文本文件,不能操作图片.视频等非文本文件 字符输入流 java.io.Reader 字符输入流中一些共性的成员方法 int read():读取单个字符并返回. int read(cha ...

  9. File类与常用IO流第六章——使用try...catch...finally处理流中的异常

    在JDK1.7之前: 1 package com.itheima.demo06.trycatch; 2 3 import java.io.FileWriter; 4 import java.io.IO ...

随机推荐

  1. 快速人体姿态估计:CVPR2019论文阅读

    快速人体姿态估计:CVPR2019论文阅读 Fast Human Pose Estimation 论文链接: http://openaccess.thecvf.com/content_CVPR_201 ...

  2. thymeleaf+Springboot实现自定义标签

    在项目开发中,有一些组件不能满足我们快速开发的要求,我们需要封装一些组件来更加的便利我们.比如,我们可以封装一个下拉框组件,只要开发人员只有引用这个组件的标签,就能出现效果,而不用再去请求url,渲染 ...

  3. 6, java数据结构和算法: 栈的应用, 逆波兰计算器, 中缀表达式--> 后缀表达式

    直接上代码: public class PolandCalculator { //栈的应用:波兰计算器: 即: 输入一个字符串,来计算结果, 比如 1+((2+3)×4)-5 结果为16 public ...

  4. fiddler操作详情

    1.设置fiddler请求过滤 2.请求与响应的格式内容  3.拦截请求操作 a.按F11开始拦截,发送请求 b.修改请求数据 c.SHIFT+F11关闭拦截 d.run to complete,把修 ...

  5. 【NX二次开发】获取体是实体还是片体UF_MODL_ask_body_type()

    判断体是实体还是片体:UF_MODL_ask_body_type() //输出 Body type: //UF_MODL_SOLID_BODY 5601 //UF_MODL_SHEET_BODY 56 ...

  6. Spring Cloud 和 Dubbo,到底用哪个好?

    Spring Cloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大 dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决 sp ...

  7. 手把手使用Python进行语音合成,文字转语音

    目录 0. 太长不看系列,直接使用 1. Python调用标贝科技语音合成接口,实现文字转语音 1.1 环境准备: 1.2 获取权限 1.2.1 登录 1.2.2 创建新应用 1.2.3 选择服务 1 ...

  8. 【题解】Luogu P1011 车站

    题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起( ...

  9. YOLO V4的模型训练

    1.YOLO V4模型训练的基本思路 所有机器学习涉及模型训练,一般都有训练集.验证集.测试集,因此需要准备数据集.有了数据集,再调用训练的算法,获取训练的结果.v3.v4模型训练方法相同. 2.YO ...

  10. .Net Core with 微服务 - Elastic APM

    上一次我们介绍了Seq日志聚合组件.这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件.APM 监控围绕对应用.服务.容器的健康监控,对接口的调用链.性能进行监控.在我们实施微服务 ...