概述
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。
特点/应用场景
在序列化期间,对象将其当前状态写入到临时或持久性存储区。
以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化:利用ObjectOutputStream,对象的信息,按固定格式转成一串字节值输出并持久保存到磁盘化。
反序列化:利用ObjectInputStream,读取磁盘中序列化数据,重新恢复对象。
- 需要序列化的文件必须实现Serializable接口以启用其序列化功能。
- 不需要序列化的数据可以被修饰为static的,由于static属于类,不随对象被序列化输出。
- 不需要序列化的数据也可以被修饰为transient临时的,只在程序运行期间,在内存中存在不会被序列化持久保存。
- 在反序列化时,如果和序列化的版本号不一致时,无法完成反序列化。
- 每个被序列化的文件都有一个唯一id,如果没有添加编译器会根据类的定义信息计算产生一个版本号。
- 常用于服务器之间的数据传输,序列化成文件,反序列化读取数据。
- 常用于使用套接字流在主机之间传递对象。
ObjectOutputStream
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。
ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream。
void writeObject(Object obj)
将指定的对象写入 ObjectOutputStream。
ObjectInputStream
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
ObjectInputStream(InputStream in)
创建从指定 InputStream 读取的 ObjectInputStream。
Object readObject()
从 ObjectInputStream 读取对象,读取序列化数据。
练习1:将学生信息序列化至磁盘【序列化】
package cn.tedu.seri;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
//对象的序列化反序列化
public class Test3_Serializable {
public static void main(String[] args) {
// method();//对象的序列化
method2();//对象的反序列化
}
//对象的反序列化:指从磁盘中加载被序列化过的文件,变成Java对象的过程 -- 读取
//要求:1、类必须有可序列化的标志,实现接口 2、可序列化的类必须有唯一的versionId才能反序列化成功
private static void method2() {
try {
//1、创建ObjectInputStream对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\teach\\1.txt"));
//2、反序列化--恢复成Student对象
Student s = (Student) in.readObject();//-向下转型-把父类类型转成子类类型-强转
System.out.println(s);//默认显示地址值,重写toString()看属性值
//3、关闭资源
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//对象的序列化:指把程序中产生的对象永久保存到磁盘中 -- 写出
private static void method() {
try {
//1、创建Student对象
Student s = new Student("jack",20,"BJ","java");
//2、序列化
ObjectOutputStream out =
new ObjectOutputStream(new FileOutputStream("D:\\teach\\1.txt"));
out.writeObject(s);
//3、关闭资源
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//创建Student类
//4、想要完成序列化,类必须有标志,实现序列化接口,接口里是空实现,只是用来做标志
class Student implements Serializable{
private static final long serialVersionUID = 1L;
//构造方法:source-倒数第三个-ok
public Student() { }
public Student(String name, int age, String addr, String subject) {
super();
this.name = name;
this.age = age;
this.addr = addr;
this.subject = subject;
}
private String name;
private int age;
private String addr;
private byte gender;
private String subject;
private byte snum;
//get()/set()
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 getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public byte getGender() {
return gender;
}
public void setGender(byte gender) {
this.gender = gender;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public byte getSnum() {
return snum;
}
public void setSnum(byte snum) {
this.snum = snum;
}
//默认显示地址值,重写toString()看属性值
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", addr=" + addr + ", gender=" + gender + ", subject="
+ subject + ", snum=" + snum + "]";
}
}