ORIGINAL:未知

Java断类的serialVersionUID来验证版本号一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地对应实体(类)的serialVersionUID进行比較,假设同样就觉得是一致的。能够进行反序列化,否则就会出现序列化版本号不一致的异常。

Eclipse中The serializable class XXXXXX does not declare a static final serialVersionUID field of type long出现这种警告处理办法。

当採用程序的Add default Serial version ID修复时,Eclipse会加上:private static final long serialVersionUID = 1L; 



当採用程序的Add generated Serial version ID修复时。Eclipse会加上:private static final long serialVersionUID = xxxxL; 



事实上这个问题出现的详细原因是和序列化中的这个serialVersionUID有关。 



serialVersionUID 用来表明类的不同版本号间的兼容性。

有两种生成方式: 



一个是默认的1L。比方:private static final long serialVersionUID = 1L;(相应修复方法1) 



一个是依据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比方: 

private static final long serialVersionUID = xxxxL;(相应修复方法2) 



在JDK中。能够利用JDK的bin文件夹下的serialver.exe工具产生这个serialVersionUID 的值,对于Test.class,运行命令: 

serialver Test   这时JVM(java虚拟机)会生成一个哈希字段。 



对照一下这个哈希字段的值与方法2中生成的字段值是一样的,可见,在CMD中使用serialver指令就是依据类名、接口名、成员方法及属性等来生成哈希字段的。 



以下来讨论java类中为什么须要重载 serialVersionUID 属性。

当两个进程在进行远程通信时。彼此能够发送各种类型的数据。不管是何种类型的数据。都会以二进制序列的形式在网络上传送。发送方须要把这个Java对象转换为字节序列,才干在网络上传送。接收方则须要把字节序列再恢复为Java对象。

  把Java对象转换为字节序列的过程称为对象的序列化。 



  把字节序列恢复为Java对象的过程称为对象的反序列化。 



  对象的序列化主要有两种用途: 



  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件里; 



  2) 在网络上传送对象的字节序列。 



java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对參数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。 



java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

仅仅有实现了Serializable和Externalizable接口的类的对象才干被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类全然由自身来控制序列化的行为,而仅实现Serializable接口的类能够採用默认的序列化方式 。

凡是实现Serializable接口的类都有一个表示序列化版本号标识符的静态变量:private static final long serialVersionUID; 



类的serialVersionUID的默认值全然依赖于Java编译器的实现,对于同一个类。用不同的Java编译器编译,有可能会导致不同的serialVersionUID。也有可能同样。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID。为它赋予明白的值。显式地定义serialVersionUID有两种用途: 



  1)在某些场合,希望类的不同版本号对序列化兼容,因此须要确保类的不同版本号具有同样的serialVersionUID。在某些场合。不希望类的不同版本号对序列化兼容。因此须要确保类的不同版本号具有不同的serialVersionUID。 



  2)当你序列化了一个类实例后,希望更改一个字段或加入一个字段。不设置serialVersionUID,所做的不论什么更改都将导致无法反序化旧有实例。并在反序列化时抛出一个异常。

假设你加入了serialVersionUID,在反序列旧有实例时,新加入或更改的字段值将设为初始化值(对象为null,基本类型为对应的初始默认值),字段被删除将不设置。 



当系统不须要序列化类时,能够去掉这些警告,做例如以下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会又一次编译程序,那些警告信息也就消失了。 



struts架构下的站点常常出现javax.servlet.ServletException: BeanUtils.populate 错误,可是本地执行又一切正常,唯一认为可能产生问题的就是server上跑了好几个站点,都是一样的架构的,怀疑是不是web容器把几个项目之间的java类给共用了,考虑到非常多类都定义了serialVersionUID字段,然后尝试删除了某个类的serialVersionUID,结果关于该类的操作就恢复正常了。网上简单查阅了一下资料。感觉是tomcat把全部类串行化时候,因为我们的几个项目非常多java类都是复制粘贴的。所造成一个非常大的类serialVersionUID它们是相同的值,所以tomcat将类相同的类名,因为不同的项目来处理同一类。这导致了一个奇怪的错误。

解决方案: 

每个项目的类具有相同的名称serialVersionUID变化是不一样的,不是直接复制粘贴。

serialVersionUID行动的更多相关文章

  1. 转:serialVersionUID作用

    汗,以前学了还忘了... Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本 ...

  2. Java中serialVersionUID的解释及两种生成方式的区别(转载)

    转载自:http://blog.csdn.net/xuanxiaochuan/article/details/25052057 serialVersionUID作用:        序列化时为了保持版 ...

  3. serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法

    ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Ser ...

  4. idea 自动提示生成 serialVersionUID

    from: http://tonycody.blog.51cto.com/8421818/1401422 Intellij IDEA 默认没启用这个功能. Setting->Inspection ...

  5. Intellij IDEA 自动生成 serialVersionUID

    转 Intellij IDEA 自动生成 serialVersionUID 收藏 tonycody 发表于 2年前 阅读 18399 收藏 5 点赞 2 评论 0 使用 Eclipse 或 MyEcl ...

  6. JAVA中SERIALVERSIONUID的解释

    serialVersionUID作用:        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式:       一个是默认的1L,比如:private st ...

  7. serialVersionUID的作用

    Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的seri ...

  8. Java基础--serialVersionUID

    Java基础--serialVersionUID serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式: 一个是默认的1L,比 ...

  9. 【转载】Understand the serialVersionUID

    If you have ever implemented Serializable interface, you must encounter this warning message The ser ...

  10. Java中serialVersionUID

    报错信息如下: Adds a default serial version ID to the selected type. Use this option to add a user-defined ...

随机推荐

  1. hibernate几个纯sql查询

    几个hibernate纯SQL询问,查询和表没有映射pojo实体和表有映射关系的实体...... 1.getSession().createSQLQuery(sql).query.addScalar( ...

  2. 于ubuntu-kylin14.10下一个,无法使用apt-get具( libc6-i386 : 赖: libc6 (= 2.15-0ubuntu10.5) 但 2.19-0ubuntu6 一个已)

    这篇文章有xhz1234(徐洪志)书写.转载请注明出处. http://blog.csdn.net/xhz1234/article/details/37044531 作者:徐洪志 背景:安装wine. ...

  3. nettyclient异步获取数据

    源代码见,以下主要是做个重要代码记录 http://download.csdn.net/detail/json20080301/8180351 NETTYclient获取数据採用的方式是异步获取数据, ...

  4. Vim 命令 【转】

    高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的: :qx     开始记录宏,并将结果存入寄存器xq     退出记录模式@x     播放记录在x寄存器中的宏命 ...

  5. git寻根——^和~的区别(转)

    一. 引子 在git操作中,我们可以使用checkout命令检出某个状态下文件,也可以使用reset命令重置到某个状态,这里所说的“某个状态”其实对应的就是一个提交(commit). 我们可以把一个g ...

  6. (大数据工程师学习路径)第一步 Linux 基础入门----数据流重定向

    介绍 开始对重定向这个概念感到些许陌生,但通过前面的课程中多次见过>或>>操作了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中.这其实就是重定向,将原本输出到标准输出的数 ...

  7. 我的MYSQL学习心得(一)

    原文:我的MYSQL学习心得(一) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL学习心得(五) 我的MYSQL ...

  8. 漫游Kafka实战篇clientAPI

    原文地址:http://blog.csdn.net/honglei915/article/details/37697655 Kafka Producer APIs 旧版的Procuder API有两种 ...

  9. 使用Mockito进行单元测试【2】—— stub 和 高级特性[转]

    一篇中介绍了Mockito的基本信息,现在接着介绍Mockito强大的stub功能 2. Mockito使用实例 5. 对连续的调用进行不同的返回 (iterator-style stubbing) ...

  10. ASP.NET MVC 使用TryUpdateModel 更新的技巧

    有使用 ASP.NET MVC 的朋友應該會對於 TryUpdateModel 有一定的認知,他不但可以利用 Metadata 來做欄位的驗證確保資料的正確性,也可以指定更新的條件以及不更新的條件來達 ...