local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2427389723552147596
该错产生来自三个原因:
1.没有指定值:BEAN没有指定序列化值即由JDK给出,客户、服务端使用了不同版本的JDK。
=》解决:要使用相同JDK
2.没有指定值:某个类在与之对应的对象已经序列化出去后做了修改,而这个属性值由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。
=》解决:要同时重启应用升级
3.指定值了:客户端BEAN和服务端的BEAN里面序列化值不同。
=》解决:最好指定,在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,对于Test.class,执行命令:serialver Test。
在《谈原型模式还有JAVA克隆还有Transient》时用到对象流,能够被写进对象流的的类都必须标记一个接口序列化。
用eclipse的话,会看到一个编译警告:
The serializable class xxx does not declare a static final serialVersionUID field of type long
那么这个变量是干啥的呢?
serialVersionUID是一个用来版本控制的UID。具体可以参考这篇文章《Understand the serialVersionUID》和相关的JSL
这篇随笔为该文章的阅读笔记。
要测试serialversionUID的版本控制功能,很简单。写三个类:
一个序列化类。
一个写对象流的类。
一个读对象流的类。
当被读取的对象和当前的序列化类的UID不同时会报错。例如:
java.io.InvalidClassException:
local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2427389723552147596
如果不给定一个UID,JVM会自动生成一个。例如上面的错误是产生于下面两段代码:
public class SerialVersionUUIDTest implements Serializable {
private static final long serialVersionUID = 1L;
}
public class SerialVersionUUIDTest implements Serializable {
}
默认自动生成的UID,有什么坏处呢?不同环境JVM对同一个类生成的UID可能会不同,从而产生错误。所以说采用分布式的技术或者把对象保存到数据库时应该要注意
分享到:
相关推荐
### Java.io.InvalidClassException Local Class Incompatible 解决方案 在Java序列化过程中,经常会遇到`java.io.InvalidClassException`异常,特别是在序列化类时如果类的版本与反序列化环境中的类版本不一致的...
29448643 JAVA.IO.INVALIDCLASSEXCEPTION: FILTER STATUS: REJECTED 29671623 CVE-2019-2725 26403575 CVE-2016-7103 29667975 CVE-2019-2824 29726561 CVE-2019-2729 29701537 CVE-2019-2827 1.2 Oracle WebLogic ...
常见的问题
Java自动序列化是一种在Java编程语言中用于持久化对象的技术,它允许我们将对象的状态转换为字节流,以便可以存储或在网络上传输。这在分布式应用程序、数据存储和跨网络进程通信中非常常见。本篇文章将深入探讨Java...
2. `java.io.InvalidClassException`异常:这个异常可能是因为类路径或JDK版本不兼容。检查JDK配置,确保使用的JDK版本与WebLogic兼容。 解决这些问题的关键在于正确配置JDK,确保MyEclipse和WebLogic使用的JDK版本...
public abstract class Humanoid implements java.io.Serializable { protected int noOfHeads; private static int totalHeads; public Humanoid() { this(1); } public Humanoid(int noOfHeads) { if ...
Java编程语言中,异常处理是程序健壮性的重要组成部分。当程序执行过程中遇到错误或特殊情况时,Java会抛出异常,这些异常分为两种主要类型:检查型异常(Checked Exceptions)和运行时异常(Runtime Exceptions)。...
Java提供了内置的序列化支持,只要一个类实现了`java.io.Serializable`接口,那么它的实例就可以被序列化。 1. **序列化接口**:`Serializable` 是Java的一个标记接口,没有包含任何方法。当一个类实现了这个接口,...
local class incompatible: stream class desc serialVersionUID = 4418622981026545151, local class serialVersionUID = -9120448754896609940 ``` 这个错误的关键在于`serialVersionUID`的不匹配。在Java中,`...
Java中的对象序列化(Serialization)和反序列化(Deserialization)是Java IO流机制的重要组成部分,它提供了一种标准的方式来将对象状态保存到持久化存储中,以及从存储中恢复对象状态的过程。下面将详细阐述序列...
如果在反序列化时,目标类的`serialVersionUID`与原始序列化时的不匹配,Java会抛出`InvalidClassException`,因为这可能意味着类的结构发生了变化,可能导致数据不兼容。因此,为避免意外的不兼容性,开发者可以在...
在Java编程中,I/O(Input/Output)是处理数据传输的关键部分,涉及文件操作、网络通信等场景。以下是对E06_IO复习内容的详细解释: 1. 获取系统路径分隔符和名称分隔符: 在Java中,我们可以使用`File....
这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来解释一下什么是序列化。在Java中,序列化(Serialization)是指将一个对象转换为字节流的过程,这个字节流可以保存到...
有时,启动WebLogic服务器可能会遇到问题,比如"The WebLogic Server did not start up properly."的提示或"java.io.InvalidClassException"异常。这些问题通常由于JDK选择错误引起。确保在MyEclipse配置中使用的JDK...
Java对象的序列化与反序列化是Java编程中一项重要的技术,它允许我们将Java对象转换为字节流,便于存储、传输或者在网络间传递。这一过程对于数据持久化、跨进程通信(如RMI,Remote Method Invocation)以及分布式...
在Java中,它通过实现`java.io.Serializable`接口来标记一个类为可序列化的。序列化的主要目的是保存对象的状态,以便在后续阶段恢复或在不同环境间传递。 2. **如何实现序列化**: 一个类只需声明实现`...
此外,对于工具的使用,Java标准库提供了`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`用于序列化和反序列化。第三方库如Apache Commons Lang的SerializationUtils,或Google的Gson和Protobuf也能简化...
Java提供了内置的序列化机制,通过实现`java.io.Serializable`接口来标记一个类可被序列化。 1. **对象序列化** - **实现Serializable接口**:为了使一个Java对象可以被序列化,该类必须实现`Serializable`接口。...
Java对象序列化是Java开发中的一个重要概念,它允许我们将Java对象转换为字节流,以便存储、传输或在不同时间点恢复。以下是五个可能不为人知的关于Java对象序列化的知识点,这些知识点对于深入理解Java开发至关重要...
在Java中,IO流(Input/Output Stream)和网络编程是两个至关重要的领域。本教程将深入探讨这两个主题,并特别关注`serialVersionUID`这个概念。`serialVersionUID`在Java序列化过程中起着关键作用。 首先,让我们...