`

"关于实现Serializable 接口的类中的SerialVersionUID"问题

    博客分类:
  • java
阅读更多
当一个类实现了Serializable接口时,表明该类可以被序列化,这个时候Eclipse会要求你为该类定义一个字段,该字段名字为serialVersionUID,类型为long,提示信息如下:
The serializable clss Student4 does not declare a static final serialVersionUID field of type long

有两种方式可以解决这个问题(你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式):
1、一个是默认的1L,比如:private static final long serialVersionUID = 1L;
2、另一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = 8940196742313994740L;之类的。

这两种方式通过在警告上面的点击ctrl+1也可以看到,里面也有。


当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个提示功能告诉你去定义之。

在Eclipse中点击类中warning的图标(或是光标移上去,然后点击crtl+1)一下【即那个黄色的图标】,Eclipse就会自动给定两种生成的方式,如上面所述。如果不想定义它,在Eclipse的设置中也可以把它关掉,设置如下:
Window==Preferences==Java==Compiler==Error/Warnings==Potential programming problems
将Serializable class without serialVersionUID的warning改成ignore即可。


如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要任何类别实现了Serializable这个接口的话,如果没有加入serialVersinoUID,Eclipse都会给你warning提示,这个serialVersionUID为了让该类别Serializable(序列化后)向后兼容。

如果你的对象序列化后存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),当你反序列化时,就会出现Exception的,这样就会造成不兼容性的问题。
但当serialVersionUID相同时(检查序列化的那个对象的serialVersionUID和已有的类里面的serialVersionUID是否相同),它就会将不一样的field以type的缺省值Deserialize(初始化),这个可以避开不兼容性的问题,就不会报错了。


分享到:
评论

相关推荐

    Java对象Serializable接口实现详解

    在实现Serializable接口时,需要注意的是必须提供一个固定的serialVersionUID变量,这个变量用于标识该类的版本号,以便在反序列化时可以正确地还原对象。例如,在上面的例子中,我们定义了一个User类,并实现了...

    Java中serialVersionUID的解释

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

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

    这样,当我们创建一个类并实现 Serializable 接口时,IntelliJ IDEA 就会提示我们生成 serialVersionUID。 在生成 serialVersionUID 时,可以选择两种方式,一种是采用默认的 1L,即 private static final long ...

    java类中serialVersionUID详解.pdf

    在 Eclipse 中,当一个类实现了 `Serializable` 接口但未明确声明 `serialVersionUID` 时,IDE 会提示警告。此时,用户可以通过以下步骤来生成或忽略该警告: 1. **生成 `serialVersionUID`**: - 点击类中的警告...

    可序列化接口Serializable

    在Java编程语言中,`Serializable`接口是一个非常重要的概念,它是实现对象持久化的关键。本文将深入探讨`Serializable`接口的细节,以及与其相关的高级知识。 `Serializable`接口是Java中的一个标记接口,没有包含...

    java类中serialVersionUID的作用及其使用

    serialVersionUID是Java语言中实现Serializable接口的类必须定义的变量,用于在反序列化时验证类的版本一致性。它是实现类持久化的重要组件,使得类可以被序列化和反序列化,从而实现了类的持久化。 在实际应用中,...

    反序列化失败的原因报告

    实现了 Serializable 接口的类需要提供一个称为 serialVersionUID 的静态final变量,该变量用于标识类的版本。 serialVersionUID serialVersionUID 是一个静态final变量,用于标识类的版本。当类的结构发生变化时...

    IDEA中实体类实现了序列化接口

    当一个实现了`Serializable`接口的类没有显式地声明`serialVersionUID`时,JVM会根据类的信息自动生成一个。但在某些情况下,例如在IntelliJ IDEA(简称IDEA)中开发时,开发者可能会遇到实体类实现了序列化接口却...

    析Android中的Serializable序列化.rar_Serializable _android

    在Android中,当一个类实现Serializable接口,那么它的实例就可以被序列化。序列化的过程是将对象转换为字节流,而反序列化则是将字节流恢复为原来的对象状态。 二、序列化的应用场景 1. 数据持久化:序列化可以将...

    序列化类的作用Serializable

    如果某个类的父类没有实现`Serializable`接口,那么子类仍然可以序列化,但是父类的字段不会被序列化,除非父类中声明了`transient`或`volatile`的字段。 在序列化过程中,有时需要对特定类的字段进行特殊处理。...

    java.io.Serializable序列化问题

    为了使一个类支持序列化,需要让该类实现 `Serializable` 接口。实现这一接口的方式非常简单,只需要添加一行代码: ```java public class MyClass implements Serializable { // 类的成员变量和其他代码 } ``` ...

    Android通过Parcelable和Serializable实现各种类型嵌套序列化

    实现Serializable接口的类会被自动处理,无需编写额外的序列化代码,但效率相对较低。 1. 在需要序列化的类上添加`implements Serializable`:这样,Java会自动生成序列化所需的元数据,如serialVersionUID。 2. ...

    序列化 serializable demo

    首先,`Serializable`接口是Java中用于实现序列化的标志接口。它没有定义任何方法,但当一个类实现了这个接口,Java的ObjectOutputStream就可以将该类的对象写入到流中。例如,`MySerializable.java`和`Product.java...

    coreJava: serialVersionUID

    在Java中,实现序列化的类需要实现`java.io.Serializable`接口。然而,仅仅实现这个接口并不足以确保序列化和反序列化始终成功,因为类的结构可能会随时间发生变化,如增加、删除或修改字段。这就是`...

    Java 串行化(序列化)Serializable/Externalizable

    1. **默认序列化**:简单地实现Serializable接口,无需额外代码,适合字段较少且不关心序列化细节的场景。 2. **自定义序列化**:通过实现Externalizable接口,自定义序列化和反序列化逻辑,适合需要优化性能或有...

    Java序列化(Serializable)与反序列化_.docx

    1. **实现Serializable接口**:实现该接口的类默认支持序列化。 2. **实现Externalizable接口**:这个接口继承自`Serializable`,提供了更高级别的控制,允许开发者自己编写序列化逻辑。 3. **序列化兼容性**:`...

    Serializable java序列号

    在Java中,如果一个类需要支持序列化,那么该类需要实现`java.io.Serializable`接口,虽然这个接口没有定义任何方法,但是它的存在作为一个标记,表明该类的对象可以被序列化。 序列化的优点主要有以下几点: 1. **...

    实验一java对象串行化编程.doc

    要使一个类可以被串行化,需要实现 Serializable 接口并提供一个 serialVersionUID 变量。 在实验中,我们定义了一个 Person 类,它实现了 Serializable 接口,并包含了 name、sex 和 age 三个属性。我们使用 ...

    Serializable-master.zip

    - 实现`Serializable`接口:首先,类必须实现`Serializable`接口,表示该类的对象可以被序列化。 - 调用`ObjectOutputStream.writeObject()`:通过`ObjectOutputStream`的`writeObject()`方法将对象写入输出流,这...

    serialVersionUID作用全面解析

    在实现 Serializable 接口的类中,如果没有显示地定义 serialVersionUID,Java 序列化机制会根据编译的 Class 自动生成一个 serialVersionUID 作序列化版本比较用。 在实际应用中,serialVersionUID 的应用场景非常...

Global site tag (gtag.js) - Google Analytics