作用是什么?
Serializable是java.io包中定义的,用于将JAVA对象进行序列化和反序列化。序列化,将一个JAVA对象以二进制流的方式持久化到数据库、文件中,或者用于大对象暂存、网络传输、使用序列化实现深度克隆;反序列化,将之前持久化在数据库或文件中的二进制数据,以流的方式读取出来重新构造成一个和之前内容相同的JAVA对象。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。
一个对象实现了Serializable接口,则所有信息(不包括被static、transient修饰的变量信息)的序列化将自动进行。
serialVersionUID的作用是什么?
默认情况下,serialVersionUID是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。对象在反序列化时,如果serialVersionUID值不同,则会抛出InvalidClassException的异常,则反序列化失败。
serialVersionUID如何定义?
有两种方法来定义serialVersionUID,无论采用哪种方法,只要其对象在序列化与反序列化过程中保持不变即可。
A. 一种是private static final long serialVersionUID = 1L;
B. 一种根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,如:private static final long serialVersionUID = -8940196742313994740L;(可以使用IDEA来生成serialVersionUID)。
静态变量的序列化
静态变量不会被序列化,静态成员变量是属于类级别的,而序列化是针对对象的,所以不能被序列化。
Transient 关键字作用(当实现Serializable接口)
Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
Transient 关键字只能修饰变量,而不能修饰方法和类,如果一个变量是类变量,则该类也实现Serializable接口。
对象序列化的方法
A. 实现Serializable接口,则所有信息(不包括被static、transient修饰的变量信息)的序列化将自动进行。
B. 实现Externalizable接口,则不会进行自动序列化,需要开发者在writeExternal()方法中手工指定需要序列化的变量,这时与是否被transient修饰就无关了。
注意事项
序列化对象必须实现序列化接口Serializable。
序列化对象中的属性如果被对象修饰的话,其对象需要实现序列化接口。
类的对象序列化后,类的序列号不能轻易更改,否则反序列化会失败。
类的对象序列化后,类的属性增加或删除不会影响序列化,只是值会丢失。
如果父类序列化,子类会继承父类的序列化;如果父类没序列化子类序列化了,子类中的属性能正常序列化,但父类的属性会丢失,不能序列化。
用JAVA序列化的二进制字节数据只能由JAVA反序列化,如果要转换成其他语言反序列化,则需要先转换成Json/XML通用格式的数据。