目录
1.基本概念
1.1序列化
- 序列化是将JavaBean对象的属性、方法和值转换为字节序列(字节流)的过程。
- 序列化后的字节序列(字节流)可保存在磁盘或用于网络传输。
- 序列化是Java对象持久化的一种实现方法。
1.2反序列化
- 反序列化是将字节序列(字节流)转换为JavaBean对象的过程。
- 字节序列(字节流)有可能从磁盘或网络中获取到。
2.意义
序列化后的字节序列(字节流)可保存在磁盘或用于网络传输,同时代表该对象已经可脱离程序而独立存在。
3.使用场景
- 当希望把内存中的JavaBean对象永久保存到本地文件或数据库中时。
- 当希望把内存中的JavaBean对象用于网络传输时。
4.实现方式
4.1实现Serializable接口
4.1.1JavaBean对象
此对象需要实现Serializable接口,此接口中没有内容,仅代表此对象可序列化。
transient修饰代表不序列化该属性。
serialVersionUID是序列化版本号,序列化和反序列化时,序列化版本号一致才能成功,反之报错。
//JavaBean对象
public static class Person implements Serializable { //实现Serializable接口
private static final long serialVersionUID = 1L; //序列化版本号
private String name;
private transient String age; //transient修饰代表不序列化此属性
public Person() {
System.out.println("无参数构造函数");
}
public Person(String name, String age) {
this.name = name;
this.age = age;
System.out.println("有参数构造函数");
}
public String toString() {
return "Person{'name':" + name + ",'age':" + age + "}";
}
}
4.1.2序列化对象
//序列化对象
ObjectOutputStream oos = null; //流
try {
//序列化对象保存位置
oos = new ObjectOutputStream(
new FileOutputStream("person.txt"));
Person person = new Person("allan","18"); //初始化需序列化的对象
oos.writeObject(person); //序列化
} catch (IOException e) {
e.printStackTrace();
}finally{
if(oos != null){
try {
oos.close(); //关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.1.3反序列化对象
//反序列化对象
ObjectInputStream ois = null; //流
try {
//指向序列化对象
ois = new ObjectInputStream(new FileInputStream("person.txt"));
//反序列化后,强制转换为JavaBean对象
Person person1 = (Person)ois.readObject(); System.out.println(person1.toString()); //打印JavaBean对象内容
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}finally{
if(ois != null){
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.注意事项
- transient修饰的属性代表不进行序列化。
- serialVersionUID是序列化版本号,序列化和反序列化时,序列化版本号一致才能成功,反之报错。
- 建议所有的JavaBean对象都支持序列化,即都实现Serializable接口。