什么是序列化/反序列化?
序列化:将对象转换为字节序列的过程称为对象的序列化
反序列化:将字节序列恢复为对象的过程称为对象的反序列化
序列化能干什么?
- 存储,比如把对象序列化为字节序列永久保存到磁盘上
- 传输,网络上传输对象的字节序列
序列化/反序列化API
java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可将obj对象进行序列化,把得到的字节序列写到一个目标输出流中;
java.io.ObjectInputStream代表对象输入流,它的readObject(Object obj)方法可从源输入流中读取字节序列,再把字节序列反序列化为对象,并返回;
序列化步骤
1)、创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流、字节数组输出流等
2)、通过对象输出流的writeObject(Object obj)方法把对象写到一个目标输出流中
反序列化步骤
1)、创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流、字节数组输入流等
2)、通过对象输入流的readObject(Object obj)方法读取对象
举个例子说明一下序列化/反序列化的应用场景
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);
}
}
------------------------
输出结果:
User [name=xiaoming, age=18]
网友评论