当前位置: 首页 > 面试题库 >

java.io.InvalidClassException:本地类不兼容:

佟颖逸
2023-03-14
问题内容

我创建客户端和服务器,然后在添加客户端类的序列化的目的,然后简单地刚走到客户在我的硬盘驱动器的html" target="_blank">文件夹,并将其粘贴到服务器correponding位置,都classname.classclassname.java分别。

它在我自己的笔记本电脑上运行良好,但是当我想在其他系统上继续工作时,当我打开项目文件夹并且客户端尝试连接到服务器后,出现以下错误:

Exception in thread "main" java.io.InvalidClassException: projectname.clasname; local class incompatible: stream classdesc serialVersionUID = -6009442170907349114, local class serialVersionUID = 6529685098267757690
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)

到底是怎么回事?是因为我使用旧版本的IDE运行程序吗?

import java.io.Serializable;
import java.net.URL;

public class KeyAdr implements Serializable {
  private static final long serialVersionUID = 6529685098267757690L;

  public URL adr;
  public String key;
}

问题答案:

如果一个类未private static final long serialVersionUID在代码中显式定义a
,则它将自动生成,并且不能保证不同的机器将生成相同的id。看起来正是这样。同样,如果类在任何方面都不同(使用不同版本的类),则自动生成的serialVersionUIDs也将不同。

Serializable界面的文档中:

如果可序列化的类未显式声明a
serialVersionUID,则序列化运行时将根据serialVersionUID该类的各个方面来计算该类的默认值,如Java™对象序列化规范中所述。但是,
强烈建议
所有可序列化的类显式声明serialVersionUID值,因为默认serialVersionUID计算对类详细信息高度敏感,而类详细信息可能会根据编译器的实现而有所不同,因此可能导致InvalidClassExceptions反序列化期间发生意外情况。因此,为了保证serialVersionUID不同Java编译器实现之间的值一致,可序列化的类必须声明一个显式serialVersionUID值。还强烈建议明确serialVersionUID声明private尽可能使用修饰符,因为此类声明仅适用于立即声明的类-
serialVersionUID字段作为继承成员没有用。数组类不能声明一个explicit
serialVersionUID,因此它们始终具有默认的计算值,但是serialVersionUID对于数组类,无需匹配值。

您应该serialVersionUID在类定义中定义一个,例如:

class MyClass implements Serializable {
    private static final long serialVersionUID = 6529685098267757690L;
    ...


 类似资料:
  • 问题内容: 我有一个公共类,该类实现了Serializable,并由其他多个类进行了扩展。只有那些子类曾经被序列化过-从来没有超类。 超类已定义了serialVersionUID。 我不确定是否重要,但是它没有标记为私有,而是仅具有默认保护-您可能会说它是受软件包保护的 但是,超类或任何子类均未实现readObject或writeObject,并且这些子类均未明确定义serialVersionUI

  • 我试图使用Cassandra Spark连接器将rdd与Cassandra表连接起来: 它在独立模式下工作,但当我在集群模式下执行时,我会得到以下错误: 会发生什么事?

  • 在使用Spark和Docker分发操作时,我遇到了类型不匹配的问题。我遵循的教程似乎很清楚。下面是我对Scala代码的尝试: build.sbt是这样的: Dockerfile取自此图,并稍加修改,以使用Spark的2.3.0版: 码头工人作曲。yml也很简单: 我将git repo克隆到文件夹中,只将Spark的版本更改为2.3.0。 最后,我用胶水粘合所有东西: 来制造脂肪罐 将jar提交到集

  • > 我在Linux机器上安装了Spark。版本为spark-1.6.2-bin-hadoop2.6.tgz. 然后使用。/sbin/start-all.sh启动Spark 我尝试在Eclipse中运行javaWordCount.java示例。但总是失败。有人能帮我吗? 例外情况如下:

  • 我正在使用JPA,列类型为: 我使用PostgreSql作为我的数据库,它支持bpchar类型,现在我尝试为我的测试添加H2,但问题是,当我运行测试时,我得到以下结果: 是否有其他方法可以实现这一目标?

  • 我试图编译一个从SourceForge得到的仍在开发中的项目。这是它的地址:。https://sourceforge.net/p/groove/code/5475/tree/groove/trunk/我知道这个项目经过了很好的验证,它没有任何错误,但是当我要编译它的时候,我遇到了这个编译错误: 错误在这个文件的第370行:https://sourceforge.net/p/groove/code/