`
fantaxy025025
  • 浏览: 1328268 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

java.io.invalidclassexception: failed to read class descriptor

 
阅读更多

 

此文来自: 马开东博客 转载请注明出处 网址 http://www.makaidong.com
摘要: 一个netty序列化引起的思考。
"一个netty序列化引起的思考"

今天在使用netty 传输网络对象报了异常错误 java.io.invalidclassexception: failed to read class descriptor

自己捣鼓了许久。

后来查了下api invalidclassexception

api文档描述

当 serialization 运行时检测到某个类具有以下问题之一时,抛出此异常。

  • 该类的序列版本号与从流中读取的类描述符的版本号不匹配
  • 该类包含未知数据类型
  • 该类没有可访问的无参数构造方法

然后看了下netty client和netty server bean 信息

client 代码

public class document implements serializable   {
    private static final long serialversionuid = 8213761673743652497l;

。。。。。。。。。。。。
}

server bean 代码

public class document implements serializable   {
    private static final long serialversionuid = 1876613896675121682l;
。。。。。。。。。。。。
}

仔细看下 不难发现 2个 bean的 serialversionuid 不一致

然后google一下 序列化id(serialversionuid)

下面对序列化id 的介绍

简单来说,java的序列化机制是通过在运行时判断类的serialversionuid来验证版本一致性的。在进行反序列化时,jvm会把传来的字节流中的serialversionuid与本地相应实体(类)的serialversionuid进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

当实现java.io.serializable接口的实体(类)没有显式地定义一个名为serialversionuid,类型为long的变量时,java序列化机制会根据编译的class自动生成一个serialversionuid作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialversionuid 。

 

如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,未作更改的类,就需要显式地定义一个名为serialversionuid,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。

 

顿时幡然大悟,应该是serialversionuid 不一致而且又不是同一次编译生成的class 。从而导致server端反序列化失败。

于是想到了解决办法。让netty client 和 netty server 共享一个document 对象即解决了问题。

 

 

 

+

+

+

=

=

=

 

分享到:
评论

相关推荐

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

    ### Java.io.InvalidClassException Local Class Incompatible 解决方案 在Java序列化过程中,经常会遇到`java.io.InvalidClassException`异常,特别是在序列化类时如果类的版本与反序列化环境中的类版本不一致的...

    p29814665_122130_Generic.zip

    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.io.InvalidClassException(解决方案).md

    项目中碰到的,记录一下解决方案

    java自动序列化

    Java自动序列化是一种在Java编程语言中用于持久化对象的技术,它允许我们将对象的状态转换为字节流,以便可以存储或在网络上传输。这在分布式应用程序、数据存储和跨网络进程通信中非常常见。本篇文章将深入探讨Java...

    weblogic 在Eclipse中的配置.docx

    2. `java.io.InvalidClassException`异常:这个异常可能是因为类路径或JDK版本不兼容。检查JDK配置,确保使用的JDK版本与WebLogic兼容。 解决这些问题的关键在于正确配置JDK,确保MyEclipse和WebLogic使用的JDK版本...

    JAVA常见异常...........

    Java编程语言中,异常处理是程序健壮性的重要组成部分。当程序执行过程中遇到错误或特殊情况时,Java会抛出异常,这些异常分为两种主要类型:检查型异常(Checked Exceptions)和运行时异常(Runtime Exceptions)。...

    E06_IO复习.pdf

    在Java编程中,I/O(Input/Output)是处理数据传输的关键部分,涉及文件操作、网络通信等场景。以下是对E06_IO复习内容的详细解释: 1. 获取系统路径分隔符和名称分隔符: 在Java中,我们可以使用`File....

    Java存储与读取对象.zip

    Java提供了内置的序列化支持,只要一个类实现了`java.io.Serializable`接口,那么它的实例就可以被序列化。 1. **序列化接口**:`Serializable` 是Java的一个标记接口,没有包含任何方法。当一个类实现了这个接口,...

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

    Java中的对象序列化(Serialization)和反序列化(Deserialization)是Java IO流机制的重要组成部分,它提供了一种标准的方式来将对象状态保存到持久化存储中,以及从存储中恢复对象状态的过程。下面将详细阐述序列...

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

    public abstract class Humanoid implements java.io.Serializable { protected int noOfHeads; private static int totalHeads; public Humanoid() { this(1); } public Humanoid(int noOfHeads) { if ...

    Serializable-master.zip

    如果在反序列化时,目标类的`serialVersionUID`与原始序列化时的不匹配,Java会抛出`InvalidClassException`,因为这可能意味着类的结构发生了变化,可能导致数据不兼容。因此,为避免意外的不兼容性,开发者可以在...

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

    这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来解释一下什么是序列化。在Java中,序列化(Serialization)是指将一个对象转换为字节流的过程,这个字节流可以保存到...

    weblogic 在Eclipse中的配置.pdf

    有时,启动WebLogic服务器可能会遇到问题,比如"The WebLogic Server did not start up properly."的提示或"java.io.InvalidClassException"异常。这些问题通常由于JDK选择错误引起。确保在MyEclipse配置中使用的JDK...

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

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

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

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

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

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

    Java存储与读取对象.7z

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

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

    Java对象序列化是Java开发中的一个重要概念,它允许我们将Java对象转换为字节流,以便存储、传输或在不同时间点恢复。以下是五个可能不为人知的关于Java对象序列化的知识点,这些知识点对于深入理解Java开发至关重要...

    614.612.JAVA基础教程_IO流与网络编程-serialVersionUID的理解(614).rar

    在Java中,IO流(Input/Output Stream)和网络编程是两个至关重要的领域。本教程将深入探讨这两个主题,并特别关注`serialVersionUID`这个概念。`serialVersionUID`在Java序列化过程中起着关键作用。 首先,让我们...

Global site tag (gtag.js) - Google Analytics