>官方解释:
Serializable接口是启用其序列化功能的接口。实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任意状态被序列化或逆序列化。
>通俗地说:
任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。
Serializable本身并没有任何成员变量和函数,它的作用只相当于一个标记,实现了该接口的类,就是告诉Java这个类是可读写的,可以写入Byte流(序列化),也可以从Byte流读取(反序列化)。
所以,需要用到Serializable的主要有两个地方:
- 需要把对象保存到数据库或文件中
- 需要把对象通过网络传输
>如何使用:
通过ObjectOutputStream 的writeObject()方法把这个类的对象写到一个地方(文件),再通过ObjectInputStream 的readObject()方法把这个对象读出来。
>几点注意:
- serialVersionUID:一般为固定的1L,也可以随机生成一个不重复的long类型数。可以理解为该可序列化类的标识,如果序列化和反序列化时涉及的类相同,但serialVersionUID不同,会导致反序列化失败,在网络传输时尤其需要注意。无特殊需要时,可默认1L;随机long型数可用于限制某些用户访问。
- 静态成员变量:类中的静态成员变量并不会被序列化保存,反序列化时为初始默认值。
- transient关键字:某些变量不想被序列化,又不适合静态声明,则可以用transient关键字修饰,反序列化时同样为初始值。transient是瞬时的意思,所以适用于一些瞬时变化的不适合保存的变量。
- 继承:父类实现Serializable后,子类自动实现。如果父类未实现,则需要有默认的无参构造函数,供子类反序列化的时候调用。
感谢:本文要点收集整理来自http://blademastercoder.github.io/2015/01/29/java-Serializable.html