File类与常用IO流第十章——序列化流
第十章、序列化流
序列化流和反序列化流概述
序列化:用一个字节序列表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等等信息。字节序列写出到文件后,相当于文件中持久保存了一个对象的信息。
反序列话:从文件中将字节序列读取回来,重构对象。
序列化与反序列化图示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中。
使用步骤:
创建oos对象,构造方法中传递字节输出流;
使用oos对象中的方法writeObject,把对象写入到文件中;
释放资源。
代码示意:
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中读取对象。
使用步骤:
创建ois对象,构造方法中传递字节输入流;
使用ois对象中的方法readObject读取保存对象的文件;
释放资源;
处理读取到的对象。
注意: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异常原理,如下示意图:

序列化集合
题目描述:序列化集合。当想要在文件中保存多个对象的时候,可以把多个对象存储到一个集合中。对集合进行序列化和反序列化操作。
步骤分析:
定义一个存储Person对象的ArrayList集合;
往ArrayList集合中存储Person对象;
创建一个序列化流oos对象
使用oos对象中方法writeObject,对集合进行序列化;
创建一个反序列化ois对象;
使用ois对象中的方法readObject读取文件中保存的集合;
把Object类型的集合转换为ArrayList类型;
遍历ArrayList集合;
释放资源。
代码实现:
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流第十章——序列化流的更多相关文章
- File类与常用IO流第四章——IO字节流
一切文件在存储时,都是以二进制数字的形式保存的,都是一个一个字节.无论使用什么样的流对象,底层传输的始终是二进制数据. 字节输出流 OutputStream java.io.OutputStream ...
- File类与常用IO流第一章File类
第一章:File类 一.1个重点单词: file:文件:directory:文件夹/目录:path:路径(绝对路径:absolutePath) 二.4个静态成员变量: 1.static String ...
- File类与常用IO流第八章——缓冲流
第八章.缓冲流 缓冲流概述 缓冲流,也叫高效流,是对4个基本的FileXxx流的增强.按照数据类型分为4类: 输入缓冲流 输出缓冲流 字节缓冲流 BufferedInputStream Buffe ...
- File类与常用IO流第七章——Properties集合
Properties概述 java.util.Properties extends Hashtable<k,v> implements Map<k,v> Properties类 ...
- File类与常用IO流第二章过滤器
在第一章中,有一个练习使用递归搜索文件 1 public static void main(String[] args) { 2 File f=new File("E:\\aaa" ...
- File类与常用IO流第九章——转换流
第九章.转换流 字节编码和字符集 编码:按照某种规则将字符以二进制存储到计算机中. 解码:将存储在计算机中的二进制数按照某种规则解析显示出来. 字符编码:Character Encoding ,就是一 ...
- File类与常用IO流第十一章——打印流
第十一章.打印流 概述:java.io.PrintStream extends OutputStream,为其他输出流添加了功能,使题目能够方便的打印各种数据值表示形式. 特点: 只负责数据的输出,不 ...
- File类与常用IO流第五章——IO字符流
字符流,只能操作文本文件,不能操作图片.视频等非文本文件 字符输入流 java.io.Reader 字符输入流中一些共性的成员方法 int read():读取单个字符并返回. int read(cha ...
- File类与常用IO流第六章——使用try...catch...finally处理流中的异常
在JDK1.7之前: 1 package com.itheima.demo06.trycatch; 2 3 import java.io.FileWriter; 4 import java.io.IO ...
随机推荐
- 人工智能AI智能加速卡技术
人工智能AI智能加速卡技术 一. 可编程AI加速卡 1. 概述: 这款可编程AI加速器卡具备 FPGA 加速的强大性能和多功能性,可部署AI加速器IP(WNN/GNN,直接加速卷积神经网络,直接运行常 ...
- 高效Tensor张量生成
高效Tensor张量生成 Efficient Tensor Creation 从C++中的Excel数据中创建Tensor张量的方法有很多种,在简单性和性能之间都有不同的折衷.本文讨论了一些方法及其权 ...
- https://www.jianshu.com/writer#/notebooks/164311/notes/88906048/preview
什么是 webassembly 在 2019 年 12 月之前,如果你要编写一个web页面,那一定离不开 html.css.js 这三个好兄弟.在 2019 年 12 月之后 W3C 宣布 webas ...
- 【NX二次开发】设置了“附加包含目录”,还是提示“无法打开包括文件”的解决方法
项目属性中的"附加包含目录"路径完全正确,但是还是无法找到头文件: 这个问题我遇到过不止一次,纠结了很久,终于发现了解决方法: 改为: 问题解决! 分析原因:项目中的属性配置 与 ...
- 合宙模块LUA相关资料汇总
1. 目录 1. 目录 [2. LUA二次开发](#2. LUA二次开发) 2.1 [新手教程](#2.1 新手教程) 2.2 [进阶教程](#2.2 进阶教程) 2.3 [LUA开发环境](#2.3 ...
- C#《大话设计模式》之模板方法模式学习笔记
static void Main(string[] args) { Console.WriteLine("学生甲抄的试卷:"); TestPaper A = new TestPap ...
- 旁路电容的PCB布局布线透彻详解(4)
原文地址点击这里: 前面使用了较多的篇幅介绍旁路电容的工作原理及其选择依据,我们已经能够为电路系统中相应的数字集成芯片选择合适的旁路电容,在实际应用过程中,旁路电容的PCB布局布线也会影响到高频噪声旁 ...
- Kubernetes之无头服务(headless)
己经看到如何使用服务来提供稳定的ip地址,从而允许客户端连接到支持服务的每个pod (或其他端点).到服务的每个连接都被转发到一个随机选择的pod上.但是如果客户端需要链接到所有的pod呢?如果后端的 ...
- Redis短结构
本章将介绍3种非常有价值的降低Redis内存占用的方法.降低Redis的内存占用有助于减少创建快照和加载快照所需的时间.提升载入AOF文件和重写AOF文件时的效率.缩短从服务器进行同步所需的时间,并且 ...
- CAS你知道吗?底层如何实现?ABA问题又是什么?关于这些你知道答案吗
CAS你知道吗?如何实现? 1. compareAndSet 在volatile当中我们提到,volatile不能保证原子语义,所以当用到变量自增时,如果用到synchronized会太"重 ...