在之前的学习过程中,我们知道了如何使用FileInputStream输入流和FileOutputStream输出流编写程序读写文件。

下面我们来学习一下如何使用序列化和反序列化读写文件。

一、序列化

1.什么是序列化?

序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保持或传输格式的过程。

在序列化过程中,会将对象的公有成员、私有成员(包括类名),转换为字节流,然后再把字节流写入数据流,存储到存储介质中,这里说的存储介质通常指文件。

序列化后的对象保存的是二进制状态,这样实现了平台无关性,通过反序列化得到对象,而无需担心数据因平台问题而显示异常。

2.使用序列化保存对象信息

序列化机制允许将实现序列化的Java对象转换为字节序列,这个过程需要借助I/O流来实现。

只有实现了java.io.Serializable接口的类的对象才能被序列化,Serializable表示可串行的,可序列化的(串行化)。

JDK中如String类、包装类和Date类等,都实现了Serializable接口。

二、反序列化

使用反序列化获取对象信息:
1.创建一个对象输出流(ObjectInputStream),它可以包装一个其它类型的输入流。
2.通过对象输入流的readObject()方法读取对象,该方法返回一个object类型的对象,如果程序知道该Java对象的类型,则可以将该对象强制转换成其真实的类型。
 import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream; import bdqn.filedemo.Student; /**
* 用序列化保存对象信息:
* 1.创建一个对象输出流(ObjectOutputStream),它可以包装一个其它类型的输出流。
* 2.通过对象输出流的writeObject()方法写对象,也就是输出可序列化对象。
* @author Administrator
*
*/
public class SerializableObj {
/**
* 使用序列化将学生对象保存到文件中,实现步骤如下:
* 1.创建学生类,实现Serializable接口
* 2.引入相关类
* 3.创建对象输出流
* 4.调用writeObject()方法将对象写入文件
* 5.关闭对象输出流
* @param args
*/
public static void main(String[] args) {
ObjectOutputStream oos = null;
try {
//创建ObjectOutputStream输出流
oos = new ObjectOutputStream(new FileOutputStream("D:\\tengyicheng\\stu.txt"));
Student stu = new Student("安娜",28,"女");
//对象序列化,写入输出流
oos.writeObject(stu);
System.out.println("录入成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
if (oos!=null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} } }
 import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; import bdqn.filedemo.Student; /**
* 使用反序列化获取对象信息:
* 1.创建一个对象输出流(ObjectInputStream),它可以包装一个其它类型的输入流。
* 2.通过对象输入流的readObject()方法读取对象,该方法返回一个object类型的对象,如果程序知道该Java对象的类型,则可以将该对象强制转换成其真实的类型。
* @author Administrator
*
*/
public class DeSerializableObj { /**
* 使用反序列化读取文件中的学生对象:
* 1.引入相关类
* 2.创建对象输入流
* 3.调用readObject()方法读取对象
* 4.关闭对象输入流。
* @param args
*/
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
//创建ObjectInputStream输入流
ois = new ObjectInputStream(new FileInputStream("D:\\tengyicheng\\stu.txt"));
Student object = (Student)ois.readObject();
System.out.println("姓名:"+object.getName());
System.out.println("年龄:"+object.getAge());
System.out.println("性别:"+object.getSex());
} catch (Exception e) {
e.printStackTrace();
}
finally{
if (ois!=null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} } }
 import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.LinkedList;
import java.util.List; import bdqn.filedemo.Student; /**
* 序列化一组对象
* @author Administrator
*
*/
public class SerializableList { public static void main(String[] args) {
ObjectOutputStream oos = null;
//创建一组学生对象
Student stu1 = new Student("李小冉",28,"女");
Student stu2 = new Student("赵丽颖",28,"女");
Student stu3 = new Student("胡歌",32,"男");
Student stu4 = new Student("王凯",35,"男");
//创建一组列表保存
List<Student> list = new LinkedList<Student>();
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
//创建对象输出流
try {
oos = new ObjectOutputStream(new FileOutputStream("D:\\tengyicheng\\stu1.txt"));
//写入输出流
oos.writeObject(list);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
if (oos!=null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} } }
 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.LinkedList;
import java.util.List; import bdqn.filedemo.Student; /**
* 反序列化读取一组对象
* @author Administrator
*
*/
public class DeSerializableList { public static void main(String[] args) {
ObjectInputStream ois = null;
try {
//创建对象输入流
ois = new ObjectInputStream(new FileInputStream("D:\\tengyicheng\\stu1.txt"));
//读取对象
@SuppressWarnings("unchecked")
List<Student> stus = (LinkedList<Student>)ois.readObject();
for (Student stu : stus) {
System.out.println("姓名:"+stu.getName());
System.out.println("年龄:"+stu.getAge());
System.out.println("性别:"+stu.getSex());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
if (ois!=null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} } }

编程进阶:Java小白的序列化Serializable接口的更多相关文章

  1. java:序列化Serializable 接口

    java:序列化Serializable 接口 public class SerializePerson implements Serializable { private String name; ...

  2. Java 序列化Serializable接口

    1 什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2  什么情况下需要 ...

  3. Java 的序列化Serializable接口介绍及应用

    常看到类中有一串很长的 如 private static final long serialVersionUID = -4667619549931154146L;的数字声明.这些其实是对此类进行序列化 ...

  4. 序列化Serializable接口

    一.序列化 1.什么是序列化? 序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保持或传输格式的过程. 在序列化过程中,会将对象的公有成员.私有成员(包括类名),转换为字节流 ...

  5. 【java】对象序列化Serializable、transient

    package 对象序列化; import java.io.Serializable; @SuppressWarnings("serial") class A implements ...

  6. 谈谈 JAVA 的对象序列化

    所谓的『JAVA 对象序列化』就是指,将一个 JAVA 对象所描述的所有内容以文件 IO 的方式写入二进制文件的一个过程.关于序列化,主要涉及两个流,ObjectInputStream 和 Objec ...

  7. Serializable接口的意义和用法

    本人软件工程大三妹子一枚,以下为个人观点仅供参考: 最近在云课堂学习springmvc+mybatis项目时,发现老师在实体类中引用了serializable这个接口,如下:   import jav ...

  8. Java Serializable接口(序列化)理解及自定义序列化

      1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...

  9. Java序列化接口Serializable接口的作用总结

    一.Java序列化接口Serializable的作用: 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字 ...

随机推荐

  1. loj #6342. 跳一跳

    #6342. 跳一跳 题目描述 现有一排方块,依次编号为 1…n1\ldots n1…n.方块 111 上有一个小人,已知当小人在方块 iii 上时,下一秒它会等概率地到方块 iii(即不动),方块  ...

  2. C++ #include " " 与 <>有什么区别?

    #include <> 和 #include "" 都会在实现定义的位置查找文件,并将其包含. 区别是若 #include "" 查找成功,则遮蔽 ...

  3. Spring Cloud-服务的注册与发现之服务注册中心(Eureka Server)

    Spring cloud是为了什么产生的? 根据官网的这个介绍来看,我们可以知道,Spring cloud是为开发者提供的一个工具,而使用这个工具的产生就是为了帮助开发者快速的开发一套比较通用的分布式 ...

  4. 洛谷P1443 马的遍历(bfs,注意输出格式)

    题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出 ...

  5. 洛谷 P2482 loj #2885 [SDOI2010]猪国杀 题解【模拟】【贪心】【搜索】

    好玩的模拟题. 以后要经常写模拟题鸭 题目描述 游戏背景 <猪国杀>是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪.每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多 ...

  6. es6 封装一个基础的表单验证

    1, 需求分析 设计一个通用的表单验证,如果后期表单中添加了更多的需求,不需要更改之前的代码逻辑,最好不要改之前的代码,需要加什么直接加就好了. 2,代码分析 此表单验证最好返回一个函数,在api设计 ...

  7. iptables 深入分析

    四表五链四表:filter , nat, manager, raw五链: 五个HOOK点的链接,pre_rout, foward, post_rout, in ,out 问题:内核如何匹配,内核使能 ...

  8. linux下的常见信号总结

    在linux下有很多信号,按可靠性分为可靠信号和非可靠信号,按时间分为实时信号和非实时信号,linux进程也有三种方式来处理收到的信号: (1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略 ...

  9. Heap — 20181120

    363. Trapping Rain Water public class Solution { /** * @param heights: a list of integers * @return: ...

  10. 集成 Jenkins 和 TestNG 实现自助式自动化测试平台

    背景介绍 在软件业十分成熟的今天,敏捷(Agile)开发在业界日益流行,而面临的挑战也日益增多,不断变化的用户需求.缩短的开发周期.频繁的部署上线.复杂的产品架构和团队组织,如何继续保证软件的质量是一 ...