private static final long serialVersionUID = 1L;是定义以一个序列号。java源码里有大量的类都有这么一个序列号。目的就是把java对象序列化而后进行保存。
java的序列化机制式通过判断类的serialVersionUID来验证版本的一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。
serialVersionUID有两种显示的生成方式:
一是默认的1L,比如:private static final long serialVersionUID = 1L;
二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
private static final long serialVersionUID=xxxxL;
当一个类实现了Serializable接口,如果没有显式的定义serialVersionUID变量的时候,java序列化机制会根据编译的Class自动生成一个serialVersionUID当作序列化版本使用,这种情况下,如果Class文件(类名、方法名等)没有发生变化(增加空格、换行、增加注释等等),就算编译再多次,serialVersionUID也不会变化的。
这个东西是用来serialization 的key,A和B相互之间传输信息,用seralize,但是相互之间把解包之后的文件进行了更改,如果你程序中不加这个,相互之间再传输,会因为这个key不一样,而失败。所以,在程序中定义,会使软件版本兼容,无论怎么改,都可以相互序列化和反序列化。
Java中,如果class实现了序列化接口,你没有加这一行,eclipse会自动给warning,建议加上,否则,JVM会自动编译生成一个序列号,这样传输会造成反序列化失败。因为不同的JVM之间的序列化算法是不一样的,不利于程序的移植。
一般情况下,建议序列化的class都给一个序列化的ID,这样可以保证序列化的成功,版本的兼容性。
http://blog.csdn.net/hulefei29/article/details/2823221
http://www.blogjava.net/invisibletank/archive/2007/11/15/160684.html
http://www.blogjava.net/sealyu/archive/2009/04/21/266759.html
private static final long serialVersionUID = 1L;是用来做什么的_爱飞的光的博客-CSDN博客
private static final long serialVersionUID = 1L 干什么的?_leetcode 解题思路-CSDN博客