`

关于实现序列化的类提示没有定义serialVersionUID域

阅读更多

The serializable class XXX does not declare a static final serialVersionUID field of type long

serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。

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

当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个提示功能告诉你去定义之。
在Eclipse中点击类中warning的图标一下,Eclipse就会自动给定两种生成的方式,如上面所述。如果不想定义它,在Eclipse的设置中也可以把它关掉的,设置如下:
Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==> Potential programming problems
将Serializable class without serialVersionUID的warning改成ignore即可。

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

如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。

但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。

分享到:
评论
1 楼 mu91077 2006-12-01  
默认的1L 和 根据类名、接口名、成员方法及属性等生成一个64位的哈希字段有什么区别?用那个更好一些,或者只能用哪一个?

相关推荐

    序列化类的作用Serializable

    需要注意的是,实现序列化的类应该谨慎处理其内部状态,因为序列化会保存对象的所有字段,包括私有(private)和受保护的(protected)成员。如果某个类的父类没有实现`Serializable`接口,那么子类仍然可以序列化,...

    java serializable 序列化与反序列化

    3. **如何实现序列化**:只需让类实现`Serializable`接口,Java的默认序列化机制就会处理剩余部分。例如: ```java public class MyObject implements Serializable { private String name; private int age; ...

    反序列化失败的原因报告

    序列化 ID 不一致是因为实体类实现了 Serializable 接口,但没有定义 serialVersionUID 的值。系统会根据类的修饰符、实现的接口、定义的方法以及属性等信息计算出 serialVersionUID,因而导致本地的实体类和服务器...

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

    1. **序列化标识符(SerialVersionUID)**:Java允许你为每个可序列化的类定义一个唯一的`serialVersionUID`,默认是由JVM根据类的结构计算出来的。如果类的版本更新导致结构变化,而此值未做更新,反序列化时会抛出`...

    Java实现序列化例子

    在Java中,如果一个类需要支持序列化,那么这个类就需要实现`java.io.Serializable`接口,尽管该接口没有任何方法需要实现,但它的存在就标志着这个类的对象可以被序列化。 首先,我们来看一下`SerializableDemo`这...

    java对象序列化和反序列化

    2. **接口**: 实现序列化的类需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有定义任何方法,但是通过实现这个接口,表明类的对象是可以被序列化的。 3. **过程**: - 序列化:使用`java.io....

    Java序列化

    - `java.io.Serializable` 是Java序列化的基础,任何类如果想要实现序列化,就必须实现这个接口。这个接口是一个标记接口,没有定义任何方法,只是表明该类的对象可以被序列化。 3. **序列化流程** - 使用 `java....

    Java中serialVersionUID的解释

    在 Eclipse 中,当我们实现了 Serializable 接口时,如果没有定义 serialVersionUID,Eclipse 会提供这个提示功能告诉我们去定义它。如果我们不想定义它,在 Eclipse 的设置中也可以把它关掉的,设置如下:Window ==...

    Java对象序列化标准最新版

    `ObjectStreamClass`类提供了关于可序列化类的信息。它描述了一个类的序列化形式,包括类名、超类、序列化ID等信息。 **4.2 动态代理类描述符** 当序列化包含代理对象的类时,`ObjectStreamClass`会生成一个动态...

    java 序列化 将实体类本地序列化

    首先,要实现序列化,一个Java类必须实现`Serializable`接口。这是一个标记接口,没有定义任何方法,只是告诉Java虚拟机(JVM)这个类的对象是可以序列化的。例如: ```java public class MyEntity implements ...

    Java中序列化学习笔记/序列和反序列化的实现

    例如,如果你有两个平台之间通过序列化进行数据交换,如果在序列化后修改了类的定义但没有更新`serialVersionUID`,那么在反序列化时就会出现问题,因为`serialVersionUID`不再匹配,Java会抛出`...

    Java 文件 序列化 读写

    - 在Java中,如果一个类想要实现序列化,只需实现`Serializable`接口即可,但该接口没有任何方法,只是一个标志接口。 3. **序列化过程**: - 使用`ObjectOutputStream`类的`writeObject()`方法将对象序列化到...

    Java序列化_Java序列化结构_

    此外,对于需要序列化的类,可以重写`readObject()`和`writeObject()`方法来自定义序列化行为,以处理特定的需求,例如忽略某些字段或执行特定的验证。 总的来说,Java序列化是Java编程中一个重要的特性,但它也有...

    序列化与反序列化Demo

    在Java中实现序列化,我们需要让类实现`java.io.Serializable`接口。这个接口没有定义任何方法,仅仅是一个标记接口,表明该类的对象可以被序列化。例如: ```java public class SerializableDemo implements ...

    java自动序列化

    这个接口是一个标记接口,没有定义任何方法,仅表示对象支持序列化。 二、为什么需要Java序列化 1. 持久化:序列化可以将对象状态持久化到磁盘,以便下次程序运行时可以恢复。 2. 网络传输:在分布式系统中,序列化...

    Java_序列化的高级认识

    为了防止不必要的序列化,可以通过在类定义中添加`transient`关键字来明确指示哪些字段不应该被序列化,这对于静态变量同样适用。 #### 父类的序列化与`transient`关键字 在Java中,子类继承自父类时,如果父类可...

    java类中serialVersionUID的作用及其使用

    2. 自动生成serialVersionUID:如果没有显式定义serialVersionUID,Java序列化机制会根据Class自动生成一个serialVersionUID。 3. 使用IDE生成serialVersionUID:在Eclipse中,可以使用IDE生成serialVersionUID,...

    关于 Java 对象序列化您不知道的 5 件事

    在本文中,我们将深入探讨关于Java对象序列化你可能不知道的五件事情,这些知识点对于理解和优化你的Java应用程序至关重要。 1. **序列化的意义与用途** Java对象序列化不仅用于持久化对象状态,还能在网络传输中...

    Java对象的序列化和反序列化实践

    在Java中,要实现序列化,对象的类需要实现`java.io.Serializable`接口。例如,`ObjectSaver.java`文件可能包含一个实现了序列化的类定义: ```java public class MySerializableObject implements Serializable { ...

Global site tag (gtag.js) - Google Analytics