private static final long serialVersionUID = 3770948625874113346L;像这个.
有些类中就声明了,大家知道这是干什么的吗?

解决方案 »

  1.   

    这个是序列化时用的
    一个类的实例在序列化时,会记录一个序列化版本号,也就是serialVersionUID
    当这个被序列化的实例被反序列化时,虚拟机会检查这个版本好,是否和当前系统中的类的版本号一致
    如果不一致,会抛出一个DeserializedException举个列子,你在第一天写了个类,然后把他给了你的朋友
    第二天,你修改了这个类,
    第三天,你朋友通过SOCKET给你穿一个该类的实例给你
    这里就涉及到你朋友先序列化这个实例,然后你反序列化
    但是,很明显,你朋友的哪个类和你手上的类是不一样的,这个反序列化可能是错误的,当然也有可能是正确的
    但JVM不知道,这时候这个serialVersionUID就起作用了
    一般,如果你的类实现了Serializeble接口,如果你没显示声明一个serialVersionUID,编译器会自动生成一个
    它的生成算法可以保证即使类的结构发生细微的变化,serialVersionUID也会不同,从而保证最大的安全性
    至少,你不会得到一个数据被破坏的实例但有时候这是没必要的,比如上面的例子中你只是修改了一行不影响实例数据结构的代码
    你明确的知道,两个版本的类数据结构是完全相同的,是可以安全的反序列化的
    此时,你可以在类中自己显示声明一个serialVersionUID,然后保证两个类中的serialVersionUID值相同
    这样JVM的反序列化就不会抛出异常不过,你必须自己保证反序列化是成功的。
    如果类的结构发生了变化,务必记得修改这个值,以避免一些错误。
      

  2.   

    1楼的说的不错,不过“如果类的结构发生了变化,务必记得修改这个值,以避免一些错误。”这句有点出入。有的时候加入这个ID就是为了能够兼容以前的版本,如果是一定要版本一致的话完全就没有必要用这个ID了(加了反而起不到效果,或者还要每次修改这个ID),因为编译后会自动的给他分配一个ID。