IO流之序列化流与反序列化流 - 极悦
首页 课程 师资 教程 报名

IO流之序列化流与反序列化流

  • 2020-11-18 17:14:44
  • 1012次 极悦

在正式介绍 IO流中的序列化流与反序列化流之前,我们先来看看何谓序列化和反序列化:

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


反序列化:该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。

用于从流中读取对象的操作流 ObjectInputStream 称为 反序列化流

用于向流中写入对象的操作流 ObjectOutputStream 称为 序列化流

用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。


一、在序列化概念的基础之上我们再来看对象序列化流ObjectOutputStream:

ObjectOutputStream将Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。

需要注意的是对象序列化流只能将支持 java.io.Serializable 接口的对象写入流中。

java.io.ObjectOutputStream extends OutputStream

ObjectOutputStream:对象的序列化流

作用:

把对象以流的方式写入到文件中保存


构造方法:

ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream。


参数:

OutputStream out:字节输出流

特有的成员方法:

void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。


使用步骤:

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

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

3.释放资源

代码演示:

public class ObjectStreamDemo {

public static void main(String[] args) throws IOException, ClassNotFoundException {

/*

* 将一个对象存储到持久化(硬盘)的设备上。

*/

writeObj();//对象的序列化。

}

public static void writeObj() throws IOException {

//1,明确存储对象的文件。

FileOutputStream fos = new FileOutputStream("tempfile\\obj.object");

//2,给操作文件对象加入写入对象功能。

ObjectOutputStream oos = new ObjectOutputStream(fos);

//3,调用了写入对象的方法。

oos.writeObject(new Person("wangcai",20));

//关闭资源。

oos.close();

}

}


Person类

public class Person implements Serializable {

private String name;

private int age;

public Person() {

super();

}

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + "]";

}

}


二、同理,我们再来看对象反序列化流ObjectInputStream

ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。支持 java.io.Serializable接口的对象才能从流读取。

java.io.ObjectInputStream extends InputStream

ObjectInputStream:对象的反序列化流

作用:

把文件中保存的对象,以流的方式读取出来使用


构造方法:

ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream。


参数:

InputStream in:字节输入流


特有的成员方法:

Object readObject() 从 ObjectInputStream 读取对象。


使用步骤:

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

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

3.释放资源

4.使用读取出来的对象(打印)


readObject方法声明抛出了ClassNotFoundException(class文件找不到异常)

当不存在对象的class文件时抛出此异常

反序列化的前提:

1.类必须实现Serializable

2.必须存在类对应的class文件

代码演示:

public class ObjectStreamDemo {

public static void main(String[] args) throws IOException, ClassNotFoundException {

readObj();//对象的反序列化。

}

public static void readObj() throws IOException, ClassNotFoundException {

//1,定义流对象关联存储了对象文件。

FileInputStream fis = new FileInputStream("tempfile\\obj.object");

//2,建立用于读取对象的功能对象。

ObjectInputStream ois = new ObjectInputStream(fis);

Person obj = (Person)ois.readObject();

System.out.println(obj.toString());

}

}


本文我们只是对IO流中的对象反序列化流和对象序列化流做了初步的了解,了解了对象反序列化流和对象序列化流的基本概念和简单的用法。IO流作为Java学习中的一个大的版块,我们只是初窥门径,想要学好IO流我们任重而道远。观看本站的Java 基础教程,为你的学习之路更进一步!


选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交