今天突然接到淘宝的电话面试,问了一些问题,其中一个是关于Java序列化的
问题大概就是serialVersionUID的作用之类的吧,当时回答是凭感觉和经验回答的,后来通过测试,我的回答是正确的,这里再总结下序列化的问题
1.Java的序列化机制只序列化对象的属性值,而不会去序列化什么所谓的方法,列化机制只保存对象的类型信息,属性的类型信息和属性值,和方法没有什么关系,你就是给这个类增加10000个方法,序列化内容也不会增加任何东西。
2.对于需要序列化和反序列化的的实体,最好加上serialVersionUID,并不要随便更改其值。
对于一个实体User好啦,实现了java.io.Serializable接口,但没有加上serialVersionUID,先实例化一个User对象并将它序列化到磁盘上,然后再反序列化,OK,这是没有问题的!看下面的:
在User类里再增加一个属性,接着再将之前序列化的文件反序列化成User对象,报错!!!为何?就是因为没有加上serialVersionUID!
如果User加上了serialVersionUID,给User增加属性后,再将之前序列化的文件反序列化回User对象,是没有问题的!!
3.总结
serialVersionUID 用来表明类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义。