概念
序列化是指将对象的状态信息转换为可以存储或传输形式的过程,在序列化期间,对象将其当前的状态写入到临时或持久性存储区,之后可以通过从存储区中读取或者反序列化对象的状态,从而重新创建对象。
序列化:
利用ObjectOutputStream,把对象的信息,按照固定的格式转成一串字节输出并持久保存在磁盘。
反序列化:
利用OjectInputStream,读取磁盘中序列化好的数据,重新恢复成对象。
特点
- 如果一个类的对象想要被序列化,那么这个类必须实现可序列化接口Serializable,用来启用序列化功能
- 不需要序列化的数据可以用static修饰,原因:static修饰的资源属于类资源,不会随着对象被序列化输出
- 不需要序列化的数据也可以用transient(临时的)修饰,只在程序运行期间在内存中存在,不会被序列化持久保存
- 每一个被序列化的文件都有一个唯一的id,如果没有添加此id,编译器会自动根据类的定义信息计算产生一个
- 在反序列化时,如果与序列化的版本号不一致,反序列化会失败
- 常用于服务器之间数据的传输,序列化成文件,反序列化读取数据
- 常用于使用套接字流在主机之间传递对象
序列化与反序列化的测试
准备一个类,用于序列化
package cn.tedu.serializable1;
import java.io.Serializable;
/*本类用来定义封装类Lover*/
/*如果本类的对象想要被序列化输出,必须实现可序列化接口Serializable*/
public class Lover implements Serializable {
//定义属性并进行封装
private String name;
private int age;
private String time;
//无参构造
public Lover() { }
//全参构造
public Lover(String name, int age, String time) {
this.name = name;
this.age = age;
this.time = time;
}
//提供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 getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
//添加重写的toString(),因为不想看到地址值,想看属性与属性值
@Override
public String toString() {
return "Lover{" +
"name='" + name + '\'' +
", age=" + age +
", time='" + time + '\'' +
'}';
}
}
进行序列化与反序列化的测试
package cn.tedu.serializable1;
import java.io.*;
/*本类用于进行序列化和反序列化的测试*/
public class TestSerializable1 {
public static void main(String[] args) {
method1();//用于序列化
method2();//用于反序列化
}
//本方法用于测试序列化
private static void method2() {
ObjectInputStream in = null;
try {
in = new ObjectInputStream(new FileInputStream("D:\\ready\\1.txt"));
Object o = in.readObject();
System.out.println(o);
System.out.println("恭喜您!反序列化成功");
}catch (Exception e){
System.out.println("很抱歉,反序列化失败");
e.printStackTrace();
}finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//本方法用来测试序列化
private static void method1() {
ObjectOutputStream out = null;
try {
out = new ObjectOutputStream(new FileOutputStream("D:\\ready\\1.txt"));
Lover person = new Lover("刘佳鑫",23,"初中");
out.writeObject(person);
out.writeObject(person2);
System.out.println("恭喜您!序列化成功");
}catch (Exception e){
System.out.println("很抱歉,序列化失败");
e.printStackTrace();
}finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}