Serializable的定义
- 任何实现了Serializable接口的类,都能够被序列化和反序列化.Serializable接口没有方法和字段,只是用来标识可序列化的语义.
- 对象在序列化的时候如果需要特殊处理,那么就需要实现以下的方法:
* private void writeObject(java.io.ObjectOutputStream out)
* throws IOException
* private void readObject(java.io.ObjectInputStream in)
* throws IOException, ClassNotFoundException;
* private void readObjectNoData()
* throws ObjectStreamException;
writeObject方法负责写入特定类的当前状态,这样相应的readObject方法才能重新恢复该对象.
readObject方法负责读入对象的字段数据.
- 对象序列化和反序列化的时候,只会处理对象类的成员变量,不会处理静态变量以及有transient关键字的变量.
序列化的意义
Java中,everything is object,在以下场景中,都需要进行对象的序列化以及反序列化.
- JVM停止时,所有对象都会被回收.Java平台为了在内存中重复使用已经创建的对象.
- 在分布式环境中,需要将对象从网络的一端传送到另一端.
- 想在数据库或者磁盘上存储对象状态的时候
- 使用RMI(远程方法调用)的时候
序列化版本号
- 序列化的时候,除了实现序列化接口,还需要创建一个局部变量:
private static final long serialVersionUID = 1234L;
反序列化时,java的序列化接口需要通过序列化版本号确定需要反序列化的对象的版本号与当前定义的类版本号是否一致.
现今的序列化方式
- 当前世界上有着多种多样的序列化方式,比如JSON,BSON等等其他一些二进制的序列化方式.他们一般都是通过java的反射机制来进行反序列化,所以对于那些方式,实现序列化接口就不是必须的了.