`
tjuking
  • 浏览: 194125 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中对serialVersionUID的解释

    博客分类:
  • Java
阅读更多
我们在IDE里编写Java项目时常常会遇到这样的警告:
引用
The serializable class ** does not declare a static final serialVersionUID field of type long

一个类或者其父类如果实现java.io.Serializable接口,并且不提供serialVersionUID值就会出现以上的warning。

JavaAPI上的一些解释:
如果一个被序列化的类没有显式声明的serialVersionUID,则程序在运行时将会计算这个类的默认的serialVersionUID值(基于类的信息)。不过在JavaAPI文档中,强烈建议将所有被序列化的类显式声明一个serialVersionUID值,因为默认的serialVersionUID的计算可能会取决于编译器实现,从而导致在反序列化过程中发生InvalidClassExceptions异常。
原文:
引用
If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible, since such declarations apply only to the immediately declaring class--serialVersionUID fields are not useful as inherited members.


解决的办法:
1,使用IDE根据对象的域值自动生成serialVersionUID(eclipse单击警告图标进行操作);
2,也可以使用默认的serialVersionUID值即:
private static final long serialVersionUID = 1L;


知识补充:
Java中对象序列化的主要作用:
  • 在远程方法调用(RMI)中,它使存活于其它计算机上的对象使用起来就像是存活于本机一样。当向远程对象发送消息时,需要通过序列化来传输参数和返回值。
  • 使用一个Bean时,一般是在设计阶段对它的状态信息进行配置。这种状态信息必须保存下来,并在程序启动时进行后期恢复,这个具体过程就由对象序列化来完成。




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics