首页 > 其他分享 >第十二章《文件与I/O流》第4节:对象序列化

第十二章《文件与I/O流》第4节:对象序列化

时间:2022-12-17 10:06:59浏览次数:34  
标签:文件 12 07 对象 null 第十二章 Person 序列化


对象序列化和反序列化是Java程序中经常涉及的操作,Java语言提供了专门用于序列化对象的ObjectOutputStream类和用于反序列化的ObjectInputStream类,这使得Java语言完成序列化及反序列化的操作变得非常容易。

12.4.1什么是对象序列化

对象的序列化是指把一个对象转换为字节序列的过程。对象的序列化简称序列化,而把一组字节序列反向恢复为一个对象的过程叫做反序列化。序列化是为了保存或传输对象,因为只有把对象转换成字节序列,才能用字节流将其存入数据源或在网络上进行传输。ObjectOutputStream是Java语言中专门用于对象序列化的类,它不仅能实现对象的序列化,还能把序列化所产生的字节序列写入数据源。相应的,ObjectInputStream类用来实现反序列化,把字节序列恢复成一个对象。

Java语言中并不是所有类的对象都能够实现序列化,只有实现了Serializable接口的类的对象才能实现序列化。Serializable是一个标志性接口,它并没有定义抽象方法,一个类实现了Serializable接口就如同被贴上了标签,表明这个类的对象能够被序列化。一个类如果可以序列化,那么它的子类也一定是可以序列化的。如果对一个不可以序列化的类对象进行序列化,将会出现NotSerializableException。对一个对象进行序列化操作时,不仅会把对象的基础数据类型属性保存下来,还会把对象中的成员对象也保存下来。如果对象中包含了没有实现Serializable接口的成员对象,那将在对对象进行序列化操作的时候也会出现NotSerializableException。

12.4.2对象序列化的实现过程

ObjectOutputStream类用于实现对象的序列化,具体来说,程序员通过调用它的writeObject()方法完成对象的序列化,并把序列化所得到的字节序列写入数据源。ObjectInputStream通过readObject()方法实现对象的反序列化。下面的【例12_07】展示了如何实现对象的序列化与反序列化。为使程序能正确运行,需要读者先在D盘根目录下新建一个12_07.txt文件。

【例12_07 对象序列化与反序列化】

Exam12_07.java

import java.io.*;
class Person implements Serializable {
String name;
int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "姓名:" + name + ",年龄:" + age;
}
}

public class Exam12_07 {
public static void main(String[] args) {
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("D:/12_07.txt");
ois = new ObjectInputStream(fis);
fos = new FileOutputStream("D:/12_07.txt");
oos = new ObjectOutputStream(fos);
Person p1 = new Person("张三", 20);
oos.writeObject(p1);// 对象的序列化
oos.flush();// 把缓冲区中的数据输出到数据源
Person p2 = (Person) ois.readObject();// 反序列化
System.out.println("p1对象:" + p1);
System.out.println("p2对象:" + p2);
System.out.println("p1与p2是否为同一对象:" + (p1 == p2));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

在Exam12_07.java中定义了两个类,其中Person类实现了Serializable接口,因此这个类的对象可以被序列化。main()方法中对一个Person类对象进行了序列化,之后又进行了反序列化,【例12_07】的运行结果如图12-9所示。

第十二章《文件与I/O流》第4节:对象序列化_Java

图12-9【例12_07】运行结果

除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

标签:文件,12,07,对象,null,第十二章,Person,序列化
From: https://blog.51cto.com/u_2266836/5949438

相关文章