1、什么是序列化
序列化就是把对象转换成字节方便存储以及传递,并且可以在从字节重构对象的一种机制。
2、序列化的作用:
分布式处理中对象的传递。负载均衡以及故障转移
3、serializable接口:
java 中一个对象要声明为可序列化的对象,只要继承Serializable接口就可以了。Serializable接口不含有任何方法。
一个对象被序列化,则其中的所有实例变量要么是基本类型,要么是可序列化的。而对于不可序列化或者我们不想序列化的变量可以用transient声明。
4、一个序列化例子
public class Employee implements Serializable{
private String name;
private double salary;
}
ObjectOutputStream out = new ObjectOutputStream(Files.newOutputStream(Path));
Employee peter = new Employee("peter",90000);
out.writeObject(peter)
反序列化
ObjectInputSteam in = new ObjectInputSteam(Files.newInputSteam(Path));
Employee peter = (Employee)in.readObject();
要做到这一点,我们需要有一个序列化号,假设A,B同时引用了C,那么序列化A的时候C也被序列化了,序列化B的时候我们检查发现C已经被序列化了。那这时候只在B中保存一个序列化号
5、readObject和writeObject方法
由于某些特殊需求我们可以重写这两个方法。我们可以在默认的读写行为上加上任意的操作。
比如Point2D这个类是不可序列化的
public class LabeledPoint implements Serializable{
private String label;
private transient Point2D point;
...
}
private void writeObject(ObjectOutputStream out){
out.defaultWriteObject();
out.writeDouble(point.getX());
out.writeDouble(point.getY());
}
<pre name="code" class="java">private void readObject(ObjectInputSteam in){
in.defaultReadObject();
double x = in.readDouble();
double y = in.readDouble();
point = new Point2D(x,y);
}