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,这个可以避开不兼容性的问题。
分享到:
相关推荐
需要注意的是,实现序列化的类应该谨慎处理其内部状态,因为序列化会保存对象的所有字段,包括私有(private)和受保护的(protected)成员。如果某个类的父类没有实现`Serializable`接口,那么子类仍然可以序列化,...
3. **如何实现序列化**:只需让类实现`Serializable`接口,Java的默认序列化机制就会处理剩余部分。例如: ```java public class MyObject implements Serializable { private String name; private int age; ...
序列化 ID 不一致是因为实体类实现了 Serializable 接口,但没有定义 serialVersionUID 的值。系统会根据类的修饰符、实现的接口、定义的方法以及属性等信息计算出 serialVersionUID,因而导致本地的实体类和服务器...
1. **序列化标识符(SerialVersionUID)**:Java允许你为每个可序列化的类定义一个唯一的`serialVersionUID`,默认是由JVM根据类的结构计算出来的。如果类的版本更新导致结构变化,而此值未做更新,反序列化时会抛出`...
在Java中,如果一个类需要支持序列化,那么这个类就需要实现`java.io.Serializable`接口,尽管该接口没有任何方法需要实现,但它的存在就标志着这个类的对象可以被序列化。 首先,我们来看一下`SerializableDemo`这...
2. **接口**: 实现序列化的类需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有定义任何方法,但是通过实现这个接口,表明类的对象是可以被序列化的。 3. **过程**: - 序列化:使用`java.io....
- `java.io.Serializable` 是Java序列化的基础,任何类如果想要实现序列化,就必须实现这个接口。这个接口是一个标记接口,没有定义任何方法,只是表明该类的对象可以被序列化。 3. **序列化流程** - 使用 `java....
在 Eclipse 中,当我们实现了 Serializable 接口时,如果没有定义 serialVersionUID,Eclipse 会提供这个提示功能告诉我们去定义它。如果我们不想定义它,在 Eclipse 的设置中也可以把它关掉的,设置如下:Window ==...
`ObjectStreamClass`类提供了关于可序列化类的信息。它描述了一个类的序列化形式,包括类名、超类、序列化ID等信息。 **4.2 动态代理类描述符** 当序列化包含代理对象的类时,`ObjectStreamClass`会生成一个动态...
首先,要实现序列化,一个Java类必须实现`Serializable`接口。这是一个标记接口,没有定义任何方法,只是告诉Java虚拟机(JVM)这个类的对象是可以序列化的。例如: ```java public class MyEntity implements ...
例如,如果你有两个平台之间通过序列化进行数据交换,如果在序列化后修改了类的定义但没有更新`serialVersionUID`,那么在反序列化时就会出现问题,因为`serialVersionUID`不再匹配,Java会抛出`...
- 在Java中,如果一个类想要实现序列化,只需实现`Serializable`接口即可,但该接口没有任何方法,只是一个标志接口。 3. **序列化过程**: - 使用`ObjectOutputStream`类的`writeObject()`方法将对象序列化到...
此外,对于需要序列化的类,可以重写`readObject()`和`writeObject()`方法来自定义序列化行为,以处理特定的需求,例如忽略某些字段或执行特定的验证。 总的来说,Java序列化是Java编程中一个重要的特性,但它也有...
在Java中实现序列化,我们需要让类实现`java.io.Serializable`接口。这个接口没有定义任何方法,仅仅是一个标记接口,表明该类的对象可以被序列化。例如: ```java public class SerializableDemo implements ...
这个接口是一个标记接口,没有定义任何方法,仅表示对象支持序列化。 二、为什么需要Java序列化 1. 持久化:序列化可以将对象状态持久化到磁盘,以便下次程序运行时可以恢复。 2. 网络传输:在分布式系统中,序列化...
为了防止不必要的序列化,可以通过在类定义中添加`transient`关键字来明确指示哪些字段不应该被序列化,这对于静态变量同样适用。 #### 父类的序列化与`transient`关键字 在Java中,子类继承自父类时,如果父类可...
2. 自动生成serialVersionUID:如果没有显式定义serialVersionUID,Java序列化机制会根据Class自动生成一个serialVersionUID。 3. 使用IDE生成serialVersionUID:在Eclipse中,可以使用IDE生成serialVersionUID,...
在本文中,我们将深入探讨关于Java对象序列化你可能不知道的五件事情,这些知识点对于理解和优化你的Java应用程序至关重要。 1. **序列化的意义与用途** Java对象序列化不仅用于持久化对象状态,还能在网络传输中...
在Java中,要实现序列化,对象的类需要实现`java.io.Serializable`接口。例如,`ObjectSaver.java`文件可能包含一个实现了序列化的类定义: ```java public class MySerializableObject implements Serializable { ...