17.4.16 ObjectOutputStream类(重点)

(1)基本概念

java.io.ObjectOutputStream类主要用于将一个对象的所有内容整体写入到输出流中。
只能将支持 java.io.Serializable 接口的对象写入流中。
类通过实现 java.io.Serializable 接口以启用其序列化功能。
所谓序列化主要指将一个对象需要存储的相关信息有效组织成字节序列的转化过程。

(2)常用的方法

方法声明 功能介绍
ObjectOutputStream(OutputStream out)
根据参数指定的引用来构造对象
void writeObject(Object obj)
用于将参数指定的对象整体写入到输出流中
void close()
用于关闭输出流并释放有关的资源

案例 ,写入对象信息要文件中。

package com.lagou.task17;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class ObjectOutputStreamTest {
public static void main(String[] args) {
ObjectOutputStream oos = null;
try {
// 1.创建ObjectOutputStream类型的对象与d:/a.txt文件关联
oos = new ObjectOutputStream(new FileOutputStream("d:/a.txt"));
// 2.准备一个User类型的对象并初始化
User user = new User("qidian", "123456", "13511258688");
// 3.将整个User类型的对象写入输出流
oos.writeObject(user);
System.out.println("写入对象成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4.关闭流对象并释放有关的资源
if (null != oos) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

17.4.17 ObjectInputStream类(重点)

(1)基本概念

java.io.ObjectInputStream类主要用于从输入流中一次性将对象整体读取出来。
所谓反序列化主要指将有效组织的字节序列恢复为一个对象及相关信息的转化过程。

(2)常用的方法

方法声明 功能介绍
ObjectInputStream(InputStream in)
根据参数指定的引用来构造对象
Object readObject()
主要用于从输入流中读取一个对象并返回 无法通过返回值
来判断是否读取到文件的末尾
void close()
用于关闭输入流并释放有关的资源

案例 从文件中读取信息

package com.lagou.task17;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ObjectInputStreamTest {
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
// 1.创建ObjectInputStream类型的对象与d:/a.txt文件关联
ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));
// 2.从输入流中读取一个对象并打印
Object obj = ois.readObject();
System.out.println("读取到的对象是:" + obj); // qidian 123456 13511258688 null
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
// 3.关闭流对象并释放有关的资源
if (null != ois) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

(3)序列化版本号

序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,
JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如
果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常
(InvalidCastException)。

(4)transient关键字

transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行
化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进
去的。

(5)经验的分享

当希望将多个对象写入文件时,通常建议将多个对象放入一个集合中,然后将集合这个整体看做一
个对象写入输出流中,此时只需要调用一次readObject方法就可以将整个集合的数据读取出来,
从而避免了通过返回值进行是否达到文件末尾的判断。