什么是序列化,什么是反序列化
序列化
把对象转换为字节序列的过程称为对象的序列化
反序列化
把字节序列恢复为对象的过程称为对象的反序列化
为什么序列化
- 持久存储时
- 网络传输时
- 通过RMI传输对象时
如何实现序列化
实现方式
实现Serializable接口
遇到的问题
- transient 修饰的属性,不会被序列化
- 静态static的属性,它不序列化
- 实现这个Serializable接口的时候,SerialVersionUID赋值
- 当属性是对象的时候,对象也有实现序列化接口
示例代码:
定义一个对象FlyPig对象:
package test;
import java.io.Serializable;
public class FlyPig implements Serializable {
private static final long serialVersionUID = 1L;
private static String AGE = "269";
private String name;
private String color;
transient private String car;
public static String getAGE() {
return AGE;
}
public static void setAGE(String AGE) {
FlyPig.AGE = AGE;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getCar() {
return car;
}
public void setCar(String car) {
this.car = car;
}
}
编写测试类:
package test;
import java.io.*;
public class serializableTest {
public static void main(String[] args) throws Exception{
serializeFlyPig();
FlyPig flyPig = deserializeFlyPig();
System.out.println(flyPig.getAGE()+ " " + flyPig.getName() + " " + flyPig.getColor() + " " + flyPig.getCar());
}
//序列化
private static void serializeFlyPig() throws Exception {
FlyPig flyPig = new FlyPig();
flyPig.setName("riemann");
flyPig.setColor("black");
flyPig.setCar("audi");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("/home/cyp/flypig.txt")));
objectOutputStream.writeObject(flyPig);
System.out.println("flyPig对象序列化完成");
objectOutputStream.close();
}
//反序列化
private static FlyPig deserializeFlyPig() throws Exception {
ObjectInputStream objectinputStream = new ObjectInputStream(new FileInputStream(new File("/home/cyp/flypig.txt")));
FlyPig flyPig = (FlyPig)objectinputStream.readObject();
System.out.println("flypig对象反序列化完成");
return flyPig;
}
}
运行结果:
flyPig对象序列化完成
flypig对象反序列化完成
269 riemann black null
通过运行结果我们发现,通过transient修饰的属性car反序列化后的值为null,说明其不能被反序列化,但是静态变量AEG的值仍是269,难道它也被序列化了?当然不是,下面进行测试:
在定义的FlyPig对象的类中,把AEG的值由269改成26,现在,如果AEG被序列化了,那么序列化后AEG的值仍是269,反序列化后显示的值应该也是269,所以,这次我们只运行serializeTest类中的反序列化方法,可以在main方法中把序列化方法注释掉,如下所示:
public static void main(String[] args) throws Exception{
//serializeFlyPig();
FlyPig flyPig = deserializeFlyPig();
System.out.println(flyPig.getAGE()+ " " + flyPig.getName() + " " + flyPig.getColor() + " " + flyPig.getCar());
}
然后运行代码,运行结果为:
flypig对象反序列化完成
26 riemann black null
我们发现,AEG的值变成了26,说明static修饰的属性AEG并没有被序列化。