`
小峰子
  • 浏览: 105642 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

<转>Eclipse中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运行时环境(JRE)根据类的内部细节自动生成的。如果对类的源代码作了修改,再重新编译,新生成的类文件的serialVersionUID的取值有可能也会发生变化。

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

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

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

当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。

分享到:
评论

相关推荐

    xml解析器,返回XmlNode结构,便于循环处理

    * &lt;p&gt;Title: Xml树&lt;/p&gt; * * &lt;p&gt;Description: &lt;/p&gt; * * &lt;p&gt;Copyright: Copyright (c) 2004&lt;/p&gt; * * &lt;p&gt;Company: &lt;/p&gt; * * @author xulinjian * @version 2.0 */ public class XmlNode implements ...

    简单的servlet增,删,改,查

    &lt;td&gt;&lt;a href='addUser.jsp'&gt;添加&lt;/a&gt;&nbsp; &lt;a href='&lt;%=basePath%&gt;DelUserServlet?id=&lt;%=users.getId()%&gt;'&gt;删除&lt;/a&gt;&nbsp; &lt;a href='updateUser.jsp'&gt;更新&lt;/a&gt;&nbsp; &lt;a href="login.jsp"&gt;登陆&lt;/...

    oscache-2.4.1-full.rar

    &lt;br/&gt; }&lt;br/&gt;&lt;br/&gt; }&lt;br/&gt; &lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; 通过CacheManager类来看怎样缓存对象的,这个类中所用的News只是具体功能的类,我就不贴出来了,你可以自己写一个! view plaincopy to clipboardprint?package...

    Java中serialVersionUID的解释

    Java中serialVersionUID的解释,对于版本的说明解释问题

    Java自定义异常案例--ExceptionManager(java源码)

    * &lt;code&gt;Exception&lt;/code&gt;. It is used to wrap all the &lt;code&gt;Throwable&lt;/code&gt; instances * and handle them in a unified way. It will show the information which consists of * StackTraces and Messages ...

    Servlet查询数据库案例--Query(java源码)

    out.println("&lt;head&gt;&lt;title&gt;DB Query&lt;/title&gt;&lt;/head&gt;\n" + "&lt;body bgcolor=white&gt;&lt;h1&gt;DB Query&lt;/h1&gt;\n" + "&lt;form&gt;&lt;b&gt;Query: &lt;/b&gt;&lt;input name='q'&gt;" + "&lt;input type=submit&gt;&lt;/form&gt;"); // See if a ...

    eclipse序列号生成器

    eclipse序列号生成器,方便大家在使用eclipse的时间生成序列号用。

    spring_MVC源码

    03. &lt;display-name&gt;s3h3&lt;/display-name&gt; 04. &lt;context-param&gt; 05. &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; 06. &lt;param-value&gt;classpath:applicationContext*.xml&lt;/param-value&gt; 07. &lt;/context-param&gt; ...

    初学java坦克大战源码

    List&lt;BloodBlock&gt; bloodBlocks = new ArrayList&lt;BloodBlock&gt;(); public void paint(Graphics g) { if(Tank.r.nextInt(100) &gt; 98){ if(this.bloodBlocks.size() &lt;=3 ){ BloodBlock bb = new BloodBlock(Tank.r...

    struts项目搭建

    &lt;filter-name&gt;struts&lt;/filter-name&gt; &lt;filter-class&gt; org.apache.struts2.dispatcher.FilterDispatcher &lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;struts&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/...

    详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文)

    本篇文章主要介绍了详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

    cms后台管理

    &lt;li&gt;&lt;a href="${a.url}" target="_blank"&gt;${a.title}&lt;/a&gt;&lt;/li&gt; [/#list] 就是简单的将tag_list中的内容,即“paramWrap.put(OUT_LIST, DEFAULT_WRAPPER.wrap(list));”中放入的数据遍历出来 style_2-1.html中的...

    ssh 万能类分页系统,可复用!

    public class PageBean&lt;DUser&gt; implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private List&lt;DUser&gt; list;//要返回的页面记录列表 private int allRow;//总记录数 ...

    java编写根据模板导出excel

    List&lt;HashMap&gt; datas = new ArrayList&lt;HashMap&gt;(); @SuppressWarnings("unchecked") HashMap&lt;String, Object&gt; map = new HashMap(); map.put("name", "1111"); datas.add(map); exportAndDownload...

    正则表达式测试工具

    bf.append("&lt;br&gt;&lt;br&gt;"); bf.append("一共找打"+i+"个匹配组!"); bf.append("&lt;/h3&gt;"); bf.append("&lt;/body&gt;&lt;/html&gt;"); } jlResult.setText(bf.toString()); ...

    比较简单的添加购物车,不过只有一个小程序

    List&lt;CartItem&gt; items=(List&lt;CartItem&gt;)this.getServletContext().getAttribute("items"); CartItem item=null; for(CartItem i : items){ if(i.getId().equals(id)){ item=i; break; } } ...

    java 文件处理代码

    TreeMap&lt;Long,File&gt; tm = new TreeMap&lt;Long,File&gt;(); File file = new File("C:\\z"); File subFile[] = file.listFiles(); int fileNum = subFile.length; for (int i = 0; i &lt; fileNum; i++) { ...

    用word书签替换的方式将网页内容导出到word

    &lt;textarea name="jcxcrs" style="display:none"&gt;&lt;c:out value="${zywstjfxbgVO.jcxcrs }"/&gt;&lt;/textarea&gt; &lt;textarea name="xcjhl" style="display:none"&gt;&lt;c:out value="${zywstjfxbgVO.xcjhl }"/&gt;&lt;/textarea&gt; ...

    轻量级java web MVC框架

    &lt;param-name&gt;ScanPackage&lt;/param-name&gt; &lt;param-value&gt;com.mvc.controller&lt;/param-value&gt; &lt;/context-param&gt; 容器在启动时候,会将com.mvc.controller下所有映射路径绑定处理方法上,假如在扫描包中定义下列类: ...

    全面解释Java中的serialVersionUID

    以下是对Java中的serialVersionUID进行了全面的分析介绍。需要的朋友可以过来参考下

Global site tag (gtag.js) - Google Analytics