什么是序列化/反序列化?
序列化:將對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化
反序列化:將字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化
序列化能干什么?
- 存儲(chǔ),比如把對(duì)象序列化為字節(jié)序列永久保存到磁盤上
- 傳輸,網(wǎng)絡(luò)上傳輸對(duì)象的字節(jié)序列
序列化/反序列化API
java.io.ObjectOutputStream代表對(duì)象輸出流,它的writeObject(Object obj)方法可將obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫到一個(gè)目標(biāo)輸出流中;
java.io.ObjectInputStream代表對(duì)象輸入流,它的readObject(Object obj)方法可從源輸入流中讀取字節(jié)序列,再把字節(jié)序列反序列化為對(duì)象,并返回;
序列化步驟
1)、創(chuàng)建一個(gè)對(duì)象輸出流,它可以包裝一個(gè)其他類型的目標(biāo)輸出流,如文件輸出流、字節(jié)數(shù)組輸出流等
2)、通過(guò)對(duì)象輸出流的writeObject(Object obj)方法把對(duì)象寫到一個(gè)目標(biāo)輸出流中
反序列化步驟
1)、創(chuàng)建一個(gè)對(duì)象輸入流,它可以包裝一個(gè)其他類型的源輸入流,如文件輸入流、字節(jié)數(shù)組輸入流等
2)、通過(guò)對(duì)象輸入流的readObject(Object obj)方法讀取對(duì)象
舉個(gè)例子說(shuō)明一下序列化/反序列化的應(yīng)用場(chǎng)景
package cn.ihep.clone;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
User u1 = new User("xiaoming", 18);
// User u2 = new User("ahua", 45);
// User u3 = new User("zhangsan", 19);
// User u4 = new User("lisi", 20);
// List<User> list = new ArrayList<>();
// list.add(u1);
// list.add(u2);
// list.add(u3);
// list.add(u4);
// 序列化
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(u1);
// 反序列化
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
User u = (User) oi.readObject();
System.out.println(u);
}
}
------------------------
輸出結(jié)果:
User [name=xiaoming, age=18]