serialVersionUID 做用

类序列化和反序列化后,修改类(加字段或方法) 遇到异常:java

Exception in thread “main” java.io.InvalidClassException: Person; local class incompatible: stream classdesc serialVersionUID = 8383901821872620925, local class serialVersionUID = -763618247875550322算法

意思就是说,文件流中的class和classpath中的class,也就是修改事后的class,不兼容了,处于安全机制考虑,程序抛出了错误,而且拒绝载入。那么若是咱们真的有需求要在序列化后添加一个字段或者方法呢?应该怎么办?那就是本身去指定serialVersionUID。以前,在咱们的例子中,咱们是没有指定serialVersionUID的,那么java编译器会自动给这个class进行一个摘要算法,相似于指纹算法,只要这个文件多一个空格,获得的UID就会大相径庭的,能够保证在这么多类中,这个编号是惟一的。因此,咱们添加了一个字段后,因为没有显指定serialVersionUID,编译器又为咱们生成了一个UID,固然和前面保存在文件中的那个不会同样了,因而就出现了2个号码不一致的错误。所以,只要咱们本身指定了serialVersionUID,就能够在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可使用,并且还多了方法能够用,呵呵。可是serialVersionUID咱们怎么去生成呢?你能够写1,也能够写2,都无所谓,可是最好仍是按照摘要算法,生成一个唯一的指纹数字,eclipse能够自动生成的,jdk也自带了这个工具。通常写法相似于 private static final long serialVersionUID = -763618247875550322L;安全

相关文章
相关标签/搜索