相关疑难解决方法(0)

Java序列化 - java.io.InvalidClassException本地类不兼容

我有一个实现Serializable的公共类,它由多个其他类扩展.之前只有那些子类被序列化 - 从来不是超类.

超类定义了一个serialVersionUID.

我不确定它是否重要,但它没有标记为私有,而是它只是默认保护 - 你可能会说它是包保护

static final long serialVersionUID = -7588980448693010399L;
Run Code Online (Sandbox Code Playgroud)

但是,超类或任何子类都实现了readObject或writeObject,并且没有子类具有明确定义的serialVersionUID.我认为超类中定义的一个就足够了.

尽管如此,只要读回以前的序列化对象,直到新的实例变量,List/ArrayList以及新方法被添加到超类中,并且一些私有实例变量被添加到其子类之一,就可以了. .

现在,当尝试读回先前序列化的对象时,会抛出异常.一个类似于此:

com.SomeCompany.SomeSubClass; local class incompatible: stream classdesc serialVersionUID = 1597316331807173261, local class serialVersionUID = -3344057582987646196
Run Code Online (Sandbox Code Playgroud)

我假设这是因为默认的serialVersionUID,因为我没有在任何子类中声明一个而使用,现在由于超类和一个子类的变化而改变了.

关于如何摆脱这种困境的建议将不胜感激.我假设我需要实现readObject和writeObject,但除了调用defaultReadObject()和defaultWriteObject()之外,我不确定我需要做什么.我也不知道是否需要将serialVerisonUID添加到所有子类中,或者是否需要每个子类实现readObject和writeObject,或者我是否可以实现它们一次,假设我需要在超类中完成.

java serialization deserialization

56
推荐指数
4
解决办法
13万
查看次数

apache Spark 中的无效类异常

我正在尝试使用 Spark-Submit 运行 Spark 作业。当我在 eclipse 中运行它时,作业运行没有任何问题。当我将相同的 jar 文件复制到远程计算机并在那里运行作业时,出现以下问题

17/08/09 10:19:15 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, ip-10-50-70-180.ec2.internal): java.io.InvalidClassException: org.apache.spark.executor.TaskMetrics; local class incompatible: stream classdesc serialVersionUID = -2231953621568687904, local class serialVersionUID = -6966587383730940799
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1829)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1986)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75)
at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:253)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)

我在 SO 中看到了一些其他链接并尝试了以下内容

  1. 将spark jars的版本从我之前使用的2.10更改为2.11。现在pom中的依赖关系看起来像这样

     <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.0.2</version>
        <scope>provided</scope>
    
    </dependency> …
    Run Code Online (Sandbox Code Playgroud)

java apache-spark

5
推荐指数
1
解决办法
2217
查看次数