ObjectOutputStream 类
<1> 基本概念
1. java.io.ObjectOutputStream类:用于将一个对象的所有内容整体写入到输出流中
2. 只能将支持 java.io.Serializable 接口的对象写入流中
3. 类通过实现 java.io.Serializable 接口以启用其序列化功能
4. 所谓序列化,指将一个对象需要储存的相关信息,有效组织成字节序列的转化过程
<2> 常用的方法
方法声明 功能介绍
ObjectOutputStream(OutputStream out) 根据参数指定的引用来构造对象
void writeObject(Object obj) 用于将参数指定的对象整体,写入到输出流中
void close() 用于关闭输出流,并释放有关的资源
<3> 代码示例
class ObjectOutputStreamTest {
main(){
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);
println("写入对象成功!");
}catch (IOException e) {
e.printStackTrace();
} finally {
// 4.关闭流对象并释放有关的资源
if (null != oos) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
// User.java public class User implements java.io.Serializable { private static final long serialVersionUID = -5814716593800822421L; private String userName; // 用户名 private String password; // 密码 private transient String phoneNum; // 手机号 表示该成员变量不参与序列化操作 public User() { } public User(String userName, String password, String phoneNum) { this.userName = userName; this.password = password; this.phoneNum = phoneNum; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } @Override public String toString() { return "User{" + "userName='" + userName + '\'' + ", password='" + password + '\'' + ", phoneNum='" + phoneNum + '\'' + '}'; } }
ObjectInputStream 类
<1> 基本概念
java.io.ObjectInputStream类:用于从输入流中,一次性将对象整体读取出来。
所谓反序列化,指将有效组织的字节序列,恢复为一个对象,及相关信息的转化过程
<2> 常用的方法
方法声明 功能介绍
ObjectInputStream(InputStream in) 根据参数指定的引用来构造对象
Object readObject() 从输入流中,读取一个对象,并返回,无法通过返回值来判断是否读取到文件的末尾
void close() 用于关闭输入流,并释放有关的资源
<3> 版本化序列号
序列化机制,是通过在运行时判断类的 serialVersionUID 来验证版本一致性的。 在进行反序列化时,JVM会把传来的字节流中的 serialVersionUID 与
本地相应实体类的 serialVersionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常
(InvalidCastException)。
<4> transient 关键字
transient 是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。
当一个对象被串行化的时候,transient 型变量的值不包括在串行化的表示中,然而非 transient 型的变量是被包括进去的。
<5> 经验
当希望将多个对象写入文件时,通常将多个对象放入一个集合中,然后将集合这个整体,看作一个对象,写入输出流中,
此时只需要调用一次 readObject方法,就可以将整个集合的数据读取出来,从而避免了通过返回值,进行是否到达文件末尾的判断。
<6> 代码示例
class ObjectInputStreamTest {
main(){
ObjectInputStream ois = null;
try{
// 1. 创建ObjectInputStream类型的对象,与d:/a.txt文件关联
ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));
// 2. 从输入流中,读取一个对象,并打印
Object obj = ois.readObject();
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();
}
}
}
}
}