Serializable是java中实现对象序列化与反序列化的方式之一,使用方式非常简单,只要在在类声明时实现Serializable接口就可以。但实际开发使用过程中,还有一些要点需要注意:
1.合理设置*serialVersionUID*
在实现Serializable接口后,IDE会提示我们设置该类的*serialVersionUID*,虽然我们经常设置为默认值1L,甚至不去设置,发现在开始使用并没有什么问题,但是这为以后的维护埋下了隐患,serialVersionUID在我们进行序列化时会被设置到保存的文件中去,当下次进行反序列化时,系统就会将文件中的serialVersionUID与类中的serialVersionUID进行对比,只用当两者相同时,才会被正确的反序列化。如果我们在后期的维护过程中,对原来的类中的成员变量进行了修改或删除,并且原先并没有设置serialVersionUID,此时系统会对修改后的类进行计算其hash值,从而造成与原先写入文件时的serialVersionUID不同,导致反序列化失败。相反,如果我们之前设置了serialVersionUID,即使后期类中的部分成员变量发生了改动,那么反序列化仍会成功,会最大限度的恢复数据。
2.注意static关键字
对于类中有static修饰的成员变量,我们称之为静态变量,实现Serializable接口类中的静态变量无法实现序列化。由于静态变量是属于类的而不是对象,而序列化主要是对对象中的变量数据进行的一种操作,所以无法序列化静态变量。
3.学会使用transient关键字
在类中的非静态成员变量中,往往会有许多非常重要的属性,比如设计用户账户信息时的密码,我们并不希望在进行序列化过程中将该属性信息存入磁盘中,因此可以在该成员变量前加上transient关键字,这样序列化过程中就不会对该变量进行序列化存储,同理反序列化过程中也不会得到该属性值。当然,transient不能修饰方法和类。
注意:如果该类实现的是Externalizable接口,那么此时transient将不会起作用。
4.如果成员变量为自定义类对象,则该类也应实现Serializable接口