无论是Serializable,还是Externalizable,他们都是实现序列化或者持久化的接口.
先解释下什么叫序列化,序列化就是对象保存到磁盘上,或者是对象由一台机器发送过来并保存下来就是序列化.
那么,serializable和externalizable就是用来标示这个对象时可以被序列化的,既然是一样的功能,那么serializable和externalizable的区别是什么:
- 实现serializable,这个确确实实就是一个可以序列化的标示,对serializable进行implements之后,我们不用实现任何的功能,但是如果选择用externalizable,则需要进行实现它其中的接口,那么这其中的工作都将是程序员的.
- 但是serializable是虚拟机内建的,那么必然是占用大多的资源,导致速度减慢.而externalizable则是由程序员决定,存储什么,那么性能就要比serializable好多了.
但是,为什么有时候即使实现了serializable或者实现了externalizable,序列化却任然失败了,这里的原因有俩个:
- 实现序列化的对象永久保存下来的只是他的数据,如果一个变量是一个对象的话,那么他的构造方法和一般方法都会被序列化.如果是树,或者是图,那么也可能不会被序列化.这其中的原因是对象中,数据时可以改变的,但是一个变量指向的对象,那么对象的值就是确定了的.而树和图也有可能由于内部数据不能确定而导致失败.
- 再有一个是有的数据不能被序列化,但是你却必须使用,那么就是导致序列化失败,解决办法是把这个不能序列化的东东用瞬时值修饰下.
public class MyClass implements Serializable {
//用transient修饰的值是瞬时的
public transient Thread myThread;
private String customerID;
private int total;
}