一、对象序列化
- 作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。
- 使用到的流是对象字节输出流:ObjectOutputStream
1、构造器
构造器 | 说明 |
---|---|
public ObjectOutputStream(OutputStream out) | 把字节输出流包装成对象字节输出流 |
2、序列化方法
方法名称 | 说明 |
---|---|
public final void writeObject(Object obj) | 将指定对象写入到磁盘文件中 |
package com.app.d5_serializable;
import java.io.Serializable;
/**
定义学生类:
对象如果要序列化,必须实现 Serializable(序列化接口)
*/
public class Student implements Serializable {
/**
学生属性:姓名、年龄、登录名称、密码
*/
private String name;
private int age;
private String loginName;
private String passWord;
public Student() {
}
public Student(String name, int age, String loginName, String passWord) {
this.name = name;
this.age = age;
this.loginName = loginName;
this.passWord = passWord;
}
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;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", loginName='" + loginName + '\'' +
", passWord='" + passWord + '\'' +
'}';
}
}
package com.app.d5_serializable;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
/**
目标:学会对象序列化,使用 ObjectOutputStream 把内存中的对象存入到磁盘文件中。
*/
public class ObjectOutputStreamDemo01 {
public static void main(String[] args) {
// 1、创建学生对象
Student s = new Student("吴磊", 22, "wulei", "123abc");
try (
// 2、对象序列化:使用对象字节输出流包装字节输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day11-io2-app/src/obj.txt"));
) {
// 3、直接调用序列化方法
oos.writeObject(s);
System.out.println("对象序列化完成~~");
}catch (Exception e) {
e.printStackTrace();
}
}
}
总结
1、对象序列化的含义是啥?
- 把对象数据存入到文件中
2、对象序列化用到哪个流?
- 对象字节输出流:ObjectOutputStream
- 序列化方法:public final void writeObject(Object obj)
3、序列化对象的要求是怎么样的?
- 对象必须实现序列化接口
二、对象反序列化
- 作用:以内存为基准,把存储到磁盘文件中的对象数据恢复成内存中的对象,称为对象反序列化。
- 使用到的流是对象字节输入流:ObjectInputStream。
1、构造器
构造器 | 说明 |
---|---|
public ObjectInputStream(InputStream in) | 把字节输入流包装成对象字节输入流 |
2、反序列化方法
方法名称 | 说明 |
---|---|
public final Object readObject() | 把存储到磁盘文件中的对象数据恢复成内存中的对象返回 |
package com.app.d5_serializable;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
/**
目标:学会对象反序列化:使用 ObjectInputStream 把磁盘文件中的对象数据恢复成内存中的Java对象
*/
public class ObjectInputStreamDemo02 {
public static void main(String[] args) {
try(
// 1、创建对象字节输入流包装字节输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day11-io2-app/src/obj.txt"));
) {
// 2、调用对象字节输入流的反序列化方法,将磁盘文件中的对象数据恢复成内存中的Java对象
Student s = (Student) ois.readObject();
System.out.println("反序列化完成~~");
System.out.println(s);
}catch (Exception e) {
e.printStackTrace();
}
}
}
反序列化完成~~
Student{name='吴磊', age=22, loginName='wulei', passWord='123abc'}
Process finished with exit code 0
三、对象序列化的注意点
1、transient关键字
-
实际开发中,如果将对象的所有信息都序列化到磁盘文件中,那么有些隐私信息容易被泄露出去。
-
所以,只要是不想泄露某些信息出去的,可以使用
transient
修饰成员变量
-
现在运行看看
2、序列化版本号
- 申明序列化的版本号码
- 序列化的版本号与反序列化的版本号码必须一致才不会报错!!
作用
- 假如哪天有业务需求,需要在对象类里增加几个新字段,然后将序列化版本号升级为2
- 必须重新序列化一遍,然后反序列化才不会出错!!否则就会报错!!
总结
1、对象反序列化的含义是啥?
- 把磁盘中的对象数据恢复到内存的Java对象中
2、对象反序列化用到了哪个流?
- 对象字节输入流:ObjectInputStream
- 反序列化方法:public final Object readObject()