`

关于serialVersionUID的解释

阅读更多

前段时间升级了Eclipse到3.1版本,在老版本的IDE环境中写的程序在Problems中会出来好多类似的警告。当采用程序的自动修复时,采用默认方式,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会重新编译程序,那些警告信息也就消失了。

  最后的建议是,如果我们开发大量需要序列化的类的时候,我们最好还是还原为原来的设置。

分享到:
评论

相关推荐

    Java中serialVersionUID的解释

    Java 中 serialVersionUID 的解释 Java 中的 serialVersionUID 是一个非常重要的概念,在实现 Serializable 接口的类中,它扮演着至关重要的角色。那么,serialVersionUID到底是什么?它又是如何生成的?在本篇文章...

    全面解释Java中的serialVersionUID

    Java中的`serialVersionUID`是一个非常重要的概念,尤其是在处理序列化和反序列化操作时。序列化是将对象的状态转换为字节流的过程,而反序列化则是将字节流恢复为对象状态。`serialVersionUID`的主要作用是确保在类...

    反序列化失败的原因报告

    下面是详细的知识点解释: 序列化和反序列化 序列化是指将对象转换成字节流的过程,以便于对象的存储或传输。反序列化是指将字节流转换回对象的过程。序列化和反序列化都是Java中实现对象持久化的一种方式。 ...

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

    以下是几种常见方法的优缺点以及自定义`ClassLoader`的详细解释: 1. **修改序列化byte数据**: 这种方法直接修改已序列化的字节数组,替换不一致的`serialVersionUID`。优点是能够解决序列化数据本身的`...

    java序列化实现演示

    在给定的链接"Java序列化机制(2)- serialVersionUID 实验"中,博主通过一个实验详细解释了`serialVersionUID`的作用和重要性。实验可能包括以下步骤: 1. 创建一个实现`Serializable`接口的简单类,并运行序列化...

    Findbugs缺陷详解与英文代号的对照表

    - **解释**: `serialVersionUID`字段用于序列化,当它不是static时,可能会导致序列化问题。 - **建议**: 将`serialVersionUID`声明为static final,以确保序列化的兼容性。 #### rule.findbugs.UCF_USELESS_...

    JDK命令详细解释,教你如何使用

    ### JDK命令详细解释 在Java开发领域中,深入理解并掌握JDK(Java Development Kit)提供的各种工具和命令是至关重要的。本文将详细介绍几个常用的JDK命令及其使用方法,包括`rmic`、`rmid`、`rmiregistry`、`...

    java除去类里面的黄色警告

    下面将详细解释如何处理这些黄色警告,并探讨几种常见的`@SuppressWarnings`注解。 ### `@SuppressWarnings("unchecked")` 当你的代码涉及到泛型(Generics)时,如果IDE检测到未检查的转换,即对类型进行了未经...

    阿里代码规范练习题目和答案.docx

    本文将根据《阿里巴巴 Java 开发手册》的要求,总结出 10 个与 Java 相关的知识点,并对每个知识点进行详细的解释和分析。 知识点 1:如何处理单元测试产生的数据 在阿里巴巴的开发规范中,单元测试产生的数据需要...

    Struts2 如何使Action取得属性范围 通配符 国际化等内容

    - **解释**: 通过`ActionContext.getContext()`获取当前的`ActionContext`实例,然后从中获取`request`对象,进一步获取`request`范围内的数据。 2. **Servlet不相关的IoC方式** - **原理**: 在这种方式下,...

    java-JDK常用命令详解

    * -verbose:使编译器和链接器输出关于正在编译哪些类和正在加载哪些类文件的信息。 * -v1.1:创建 JDK 1.1 stub 协议版本的 stub 和 skeleton。 * -v1.2:创建 JDK 1.2 stub 协议版本的 stub。 2. rmid 命令 rmid...

    java课程设计吕磊代码(科学计算器).pdf

    以下是对关键知识点的详细解释: 1. **Java Swing**: Java Swing是一个用于构建桌面应用的图形用户界面(GUI)工具包。在这个科学计算器的设计中,我们使用了`javax.swing.*`,它包含了创建窗口、按钮、文本框等GUI...

    阿里代码规范练习题目及答案.pdf

    - 弃用的代码段应加上注释,解释原因。 - 注释掉的代码片段上方应使用三个斜杠(///)注明注释原因。 - 视图模板中不应包含复杂逻辑,保持简洁。 4. **分页查询**: - 当查询结果为0时,应立即返回,避免不必要...

    java 对象的序列化与反序列化

    首先,我们来解释一下什么是序列化。在Java中,序列化(Serialization)是指将一个对象转换为字节流的过程,这个字节流可以保存到磁盘上,或者通过网络进行传输。要实现一个对象的序列化,该对象的类必须实现`...

    Java序列化的机制和原理[归类].pdf

    以下是关于Java序列化机制和原理的详细解释: 1. **序列化接口**: Java中的序列化是通过实现`Serializable`接口来实现的。这个接口没有任何方法,它的存在仅仅是为了标记一个类可以被序列化。如以下示例所示: `...

    java规范

    5. **`serialVersionUID`:** 如果类实现了 `Serializable` 接口,则推荐定义一个 `serialVersionUID` 字段,以确保序列化版本的兼容性。 #### 三、主方法与程序入口 **重要性:** `main()` 方法是 Java 程序的...

    java学习笔记JDK6课件和课本代码

    5. **编译器自动插入 serialVersionUID**:对于序列化,如果未显式声明`serialVersionUID`,JDK6会自动插入一个。 6. **NIO.2**:引入了新的非阻塞I/O API,如`java.nio.file`包,提供了文件系统操作的现代接口,...

    Java反序列化漏洞介绍书籍

    4. **自定义序列化与反序列化**:解释了如何使用`writeObject()`和`readObject()`方法以及`serialVersionUID`字段来自定义序列化行为,以确保安全性。 5. **Gadgets和Gadget Chains**:深入解释了gadgets的概念,...

    java课程设计计算器3科学计算器.pdf

    以下将详细解释这些知识点: 1. **GUI设计**: - `javax.swing.*` 和 `java.awt.*` 包:这两个包提供了构建Java GUI所需的基本组件和布局管理器。`JFrame` 是Java Swing中的顶级容器,用于创建窗口。`JPanel` 是一...

    jfreechart 用法

    private static final long serialVersionUID = 3257566209007171634L; public double cpuValue1; public double cpuValue2; public double cpuValue3; private TimeSeries cpu1; private TimeSeries cpu2...

Global site tag (gtag.js) - Google Analytics