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

serialVersionUID 的 warring 的问题

阅读更多
package com.test.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class MyInterceptor implements Interceptor {

	public void destroy() {
		System.out.println("MyInterceptor destroy");
	}

	public void init() {
		System.out.println("MyInterceptor init");
	}

	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("MyInterceptor intercept");
		invocation.invoke();
		return null;
	}

}


package com.test.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class MyInterceptor implements Interceptor {

	/**
	 * serialVersionUID MyInterceptor
	 */
	private static final long serialVersionUID = 1L;

	public void destroy() {
		System.out.println("MyInterceptor destroy");
	}

	public void init() {
		System.out.println("MyInterceptor init");
	}

	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("MyInterceptor intercept");
		invocation.invoke();
		return null;
	}

}

===============================================================================
用Eclipse的IDE环境中实现序列化,在Problems中会出来好多类似 serialVersionUID的警告。当采用程序的自动修复时,采用默认方式,Eclipse会加上:private static final long serialVersionUID = 1L; 其实这个问题倒也不影响程序的运行,但是我看到Problems里面有警告就不舒服,同时也说明我们写的代码还是不规范。具体的原因还就是和序列化中的这个serialVersionUID有关。serialVersionUID 用来表明类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个 serialVersionUID,对于Test.class,执行命令:serialver Test。为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义。这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window(窗口)-->Preferences(首选项)-->Java-->编译器-->错误/警告,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。最后的建议是,如果我们开发大量需要序列化的类的时候,我们最好还是还原为原来的设置。
============================================补充
例子中 Interceptor 继承 Serializable 而 java.io.Serializable 接口的类是可序列化的所有出现serialVersionUID  相关的反序列化问题.
分享到:
评论

相关推荐

    Java中serialVersionUID的解释

    因此,我们可以看到,serialVersionUID扮演着非常重要的角色,它可以帮助我们避免不兼容性问题的出现,并保持版本的兼容性。所以,在实现 Serializable 接口时,我们一定要注意到 serialVersionUID 的定义和使用。

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

    IntelliJ IDEA 自动生成 serialVersionUID 在 Java 序列化机制中,serialVersionUID 是一个不可或缺的角色,它可以通过在运行时判断类的 serialVersionUID 来验证版本一致性。在进行反序列化时,JVM 会把传来的字节...

    coreJava: serialVersionUID

    通过阅读这篇博客,开发者可以更好地理解如何有效地管理类的序列化版本,从而避免遇到因类结构变化而导致的序列化问题。 总结来说,`serialVersionUID`是Java序列化机制的一个关键部分,它帮助维护序列化对象的版本...

    java类中serialVersionUID详解.pdf

    - **版本控制**:在更新类结构时,可以通过修改 `serialVersionUID` 来标记版本变更,从而避免因类结构改变导致的序列化问题。 #### 七、总结 综上所述,`serialVersionUID` 在 Java 的序列化机制中扮演着关键角色...

    serialVersionUID作用全面解析

    3. 防止版本不兼容:serialVersionUID 可以防止版本不兼容的问题。在实现 Serializable 接口的类中,如果没有显示地定义 serialVersionUID,Java 序列化机制会根据编译的 Class 自动生成一个 serialVersionUID 作...

    java类中serialVersionUID的作用及其使用

    Java类中serialVersionUID的作用及其使用 Java类中serialVersionUID是一种特殊的静态变量,用于标识类的序列化版本。它是Java语言中实现Serializable接口的类必须定义的变量,用于在反序列化时验证类的版本一致性。...

    idea如何自动生成serialVersionUID

    "IDEA如何自动生成serialVersionUID" IDEA中自动生成serialVersionUID是Java开发中的一项重要功能,因为serialVersionUID是一个非常重要的字段,用于验证类的版本一致性。在本文中,我们将详细介绍如何使用IDEA自动...

    serialVersionUID.txt

    三期第一张IO笔记 6

    全面解释Java中的serialVersionUID

    `serialVersionUID`的存在是为了防止版本升级导致的兼容性问题。例如,当你序列化了一个对象,然后修改了类的字段(增加、删除或修改),如果没有`serialVersionUID`或者`serialVersionUID`未更新,反序列化时将无法...

    使用自定义ClassLoader解决反序列化serialVesionUID不一致问题 _ 回忆飘如雪1

    然而,当序列化的对象在不同环境中被反序列化时,可能会遇到`serialVersionUID`不一致的问题。`serialVersionUID`是一个特殊的标识符,用于确保序列化和反序列化之间的兼容性。如果类的`serialVersionUID`在序列化和...

    614.612.JAVA基础教程_IO流与网络编程-serialVersionUID的理解(614).rar

    这样做可以避免因未来修改类结构而导致的序列化问题。例如: ```java public class MyClass implements Serializable { private static final long serialVersionUID = 1L; // 版本号 // ... } ``` 在这个例子中...

    java序列化和serialVersionUID的使用方法实例

    Java 序列化和 serialVersionUID 的使用方法实例 Java 序列化是指将 Java 对象转换为二进制流的过程,以便在网络中传输或持久化到数据库或文件系统中。序列化的作用是将 Java 对象的状态保存起来,以便下次使用时...

    序列化版本号serialVersionUID的作用_动力节点Java学院整理

    序列化版本号serialVersionUID的作用_动力节点Java学院整理.

    java.io.InvalidClassException local class incompatible 处理方法

    为了避免序列化过程中出现`java.io.InvalidClassException`异常,特别是处理序列化对象版本兼容性问题时,强烈推荐在所有可序列化的类中显式声明`serialVersionUID`。这不仅可以提高程序的稳定性和健壮性,还能简化...

    Weblogic9异常解决nested errors.txt

    标题和描述均提到了“Weblogic9异常解决nested errors”,这指向了在使用WebLogic Server 9版本时可能遇到的特定错误处理问题。WebLogic Server是Oracle公司提供的一款功能强大的应用服务器,它支持多种标准协议,如...

    反序列化失败的原因报告

    系统会根据类的修饰符、实现的接口、定义的方法以及属性等信息计算出 serialVersionUID,因而导致本地的实体类和服务器上的实体类的 serialVersionUID 不一致。 解决方案 解决反序列化失败的解决方案是给相关实体...

    GenerateSerialVersionUID

    2. 版本升级时考虑`serialVersionUID`:当类进行重大修改时,可能需要更新`serialVersionUID`,以防止反序列化问题。 3. 使用工具生成:利用`GenerateSerialVersionUID`等插件,可以方便地生成和管理`...

    java序列化实现演示

    5. 更新`serialVersionUID`为新的值,再次尝试反序列化,观察问题是否得到解决。 显式声明`serialVersionUID`的好处在于,开发者可以控制序列化版本的变更,确保在类结构变化时,有意识地更新版本号,从而避免意外...

Global site tag (gtag.js) - Google Analytics