`

有关序列化的问题 java.io.InvalidClassException

阅读更多

当一个类实现了序列化接口,有时会遇到 java.io.InvalidClassException 异常出现:
java.io.InvalidClassException: com.test.Test; local class incompatible: stream classdesc serialVersionUID = 7981560250804078637, local class serialVersionUID = -8334405535174160822
这是序列化兼容性所致;
java通过一个名为UID(stream unique identifier)来控制,这个UID是隐式的,它通过类名,方法名等诸多因素经过计算而得,理论上是一一映射的关系,也就是唯一的。如果UID不一样的话,就无法实现反序列化了,并且将会得到InvalidClassException。
当要人为的产生一个新的版本(实现并没有改动),而抛弃以前的版本的话,可以通过显式的声名UID来实现:
private static final long serialVersionUID=????;//(你可以编造一个UID,但不能有重复)

对于上例我们可以在com.test.Test类中加入 :
private static final long serialVersionUID=7981560250804078637l;
这样就解决了新老版本的兼容性问题。
当然,对于序列化还有很多问题,慢慢研究吧。

分享到:
评论

相关推荐

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

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

    java自动序列化

    1. `java.io.ObjectOutputStream`和`java.io.ObjectInputStream`:基础的序列化和反序列化工具类。 2. `java.io.Serializable`: 标记接口,表明对象支持序列化。 3. `java.io.NotSerializableException`: 当尝试序列...

    Java对象序列化详细解析.doc

    在Java中,对象序列化是通过实现`java.io.Serializable`接口来实现的。 **Serializable接口**: `Serializable`接口是一个标记接口,它没有定义任何方法。当一个类实现了这个接口,就意味着该类的对象可以被序列化...

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

    Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...

    Java对象的序列化与反序列化Java开发Java经验技巧

    Java对象的序列化与反序列化是Java编程中一项重要的技术,它允许我们将Java对象转换为字节流,便于存储、传输或者在网络间传递。这一过程对于数据持久化、跨进程通信(如RMI,Remote Method Invocation)以及分布式...

    Java 多次序列化对象到同壹個文件及反序列化的问题

    此外,对于工具的使用,Java标准库提供了`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`用于序列化和反序列化。第三方库如Apache Commons Lang的SerializationUtils,或Google的Gson和Protobuf也能简化...

    java序列化实现演示

    在Java中,如果一个类需要支持序列化,它应该实现`java.io.Serializable`接口。 在Java序列化过程中,`serialVersionUID`扮演着至关重要的角色。`serialVersionUID`是一个长期不变的标识符,用于验证序列化版本的...

    Java对象序列化的秘密

    在Java中,实现对象序列化主要依靠实现`java.io.Serializable`接口。本文将深入探讨Java对象序列化的原理、用途和注意事项。 **一、序列化原理** 1. **实现Serializable接口**: 对象要能够被序列化,它所在的类...

    如何正确的使用Java序列化技术

    为了将可序列化的对象序列化到文件或其他存储介质中,需要使用 `java.io.ObjectOutputStream` 和 `java.io.ObjectInputStream` 类。以下是一个简单的序列化示例: ```java import java.io.*; public class ...

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

    通过实现`java.io.Serializable`接口,一个类的实例就能被序列化。 2. **默认序列化过程** 默认情况下,序列化会保存对象的所有实例变量,但不包括静态变量。这是因为静态变量属于类,而非特定的对象实例。序列化...

    序列化(三) 实例分析深入了解序列化

    在Java中,它通过实现`java.io.Serializable`接口来标记一个类为可序列化的。序列化的主要目的是保存对象的状态,以便在后续阶段恢复或在不同环境间传递。 2. **如何实现序列化**: 一个类只需声明实现`...

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

    `java.io.ObjectStreamClass`类提供了关于正在序列化或反序列化的类的信息,包括类的`serialVersionUID`、是否为`Serializable`以及类的字段描述。 9. **序列化流的性能优化**: 序列化和反序列化可能会消耗大量...

    对象的序列化和反序列化

    在Java中,如果一个类需要支持序列化,那么这个类就需要实现`java.io.Serializable`接口。这是一个标记接口,没有包含任何方法,它仅仅表示该类的对象可以被序列化。当一个对象实例化后,如果其类实现了`...

    Java IO流对象的序列化和反序列化实例详解

    下面将详细阐述序列化和反序列化的概念、操作步骤以及相关的知识点。 序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化过程中,对象被转换成一系列字节,这些字节可以存储在文件中或通过网络...

    Java序列化与反序列化

    在Java中,要实现序列化,一个类必须实现`java.io.Serializable`接口。这是一个标记接口,没有包含任何方法,它的作用仅仅是告诉JVM该类的对象可以被序列化。例如,我们有一个名为`Child`的类,它可能如下所示: ``...

    类的序列化

    在Java中,序列化是通过实现`java.io.Serializable`接口来实现的。 序列化主要有以下几个关键知识点: 1. **实现Serializable接口**:要使一个类能够被序列化,该类必须实现`Serializable`接口。这个接口没有定义...

    序列化和反序列化1

    总结来说,Java的序列化和反序列化是通过`Serializable`接口和相关机制实现的,它对于数据持久化、网络通信和跨进程通信至关重要。通过自定义序列化和反序列化方法,我们可以更好地控制对象的存储和恢复过程,确保...

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

    Java序列化是Java平台提供的一种将对象转换为字节流,以便存储、网络传输或持久化数据的标准机制。它在Java开发中起着至关重要的作用,特别是在分布式系统和跨进程通信中,因为对象需要在网络之间传输。以下是关于...

    Java存储与读取对象.7z

    Java提供了内置的序列化机制,通过实现`java.io.Serializable`接口来标记一个类可被序列化。 1. **对象序列化** - **实现Serializable接口**:为了使一个Java对象可以被序列化,该类必须实现`Serializable`接口。...

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

    在Java中,如果一个类需要支持序列化,那么这个类需要实现`java.io.Serializable`接口。实现该接口后,Java虚拟机(JVM)会根据类的信息生成一个序列化ID,即`serialVersionUID`,用于表示类的版本标识。如果序列化ID...

Global site tag (gtag.js) - Google Analytics