当前位置: 首页 > news >正文

葫芦岛做网站价格建e室内设计网官网图库

葫芦岛做网站价格,建e室内设计网官网图库,房产汽车网站模板,做网站的意义大不大serialVersionUID的作用 引用:> http://blog.csdn.net/dancen/article/details/7236575 Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体&am…

serialVersionUID的作用

引用:> http://blog.csdn.net/dancen/article/details/7236575

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 错误,但是本地运行又一切正常,唯一觉得可能产生问题的就是服务器上跑了好几个网站,都是一样的架构的,怀疑是不是web容器把几个项目之间的java类给共用了,考虑到很多类都定义了serialVersionUID字段,然后尝试删除了某个类的serialVersionUID,结果关于该类的操作就恢复正常了。网上简单查阅了一下资料,感觉是tomcat把所有类串行化时候,由于我们的几个项目很多java类都是复制粘贴的,所以导致了很多类的serialVersionUID都是同一个值,所以tomcat会把不同项目的相同类名的类当作同一个类去处理,导致了这个奇怪的错误。

解决方案:
每个项目同名的类serialVersionUID改为不一样,不能直接的复制粘贴过来。


技巧一:eclipse批量生成serialVersionUID的方法

源码->清理->配置->缺少的代码->添加串行版本标识

这里写图片描述

http://www.yayakq.cn/news/696317/

相关文章:

  • 做漫画视频在线观看网站律师用的网站模板
  • 环江住房和城乡建设部网站生物医药网站建设
  • 网站 模板下载外部调用wordpress站点文章
  • 个人网站背景图片企业推广方案
  • 广西建设职业技术学院贫困生网站北京朝阳区做网站
  • 教做软件的网站河南省安阳市建设银行网站
  • 网站建设法律可行性示范校建设专题网站四平卫生学校
  • 怎样用自己的空间做网站黑龙江网站建设工作室
  • 花店网站建设方案网站wordpress是什么意思
  • 团购网站 方案南宁网站建设nnxun
  • 邵阳微网站开发lz2v建工社微课程官网
  • 动易学校网站管理系统 下载网站建设需要考虑的问题
  • 上海建科建设监理网站免费域名备案
  • 网站必须做等保合规网络广告宣传怎么做
  • wordpress 手机主题网站优化外包多少钱
  • 唐山营销型网站建设dede网站后台设置wap模板目录
  • 网站建设如何行业资讯网站源码
  • 如何做一款服装网站wordpress网络图片不显示
  • 工程项目查询哪个网站收费网站怎么建立
  • 写作网站原码上海产品网站建设
  • 建设的基本流程网站网站制作企业有哪些
  • 潍坊仿站定制模板建站谷歌seo建站
  • 搭建网站流程python 做网站优势
  • 网站做备案关停会显示什么推广公众号有哪些方法
  • 怎样做自己的加密网站河北省住房城乡建设局网站首页
  • 镇江网站制作网站建设网页版qq登录网址
  • 外贸建站 宁波建筑施工单位网站
  • 网站建设投标书组成wordpress七牛云缩略图
  • 网站管理助手 ftp建设商务网站的经济可行性分析
  • 购物网站建设公wordpress为什么是英文