Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.io.InvalidClassException: InvalidClassException:本地类不兼容:流classdesc SerialVersionId=-196410440475012755,本地类SerialVersionId=-6675950253085108747_Java_Serialization - Fatal编程技术网

java.io.InvalidClassException: InvalidClassException:本地类不兼容:流classdesc SerialVersionId=-196410440475012755,本地类SerialVersionId=-6675950253085108747

java.io.InvalidClassException: InvalidClassException:本地类不兼容:流classdesc SerialVersionId=-196410440475012755,本地类SerialVersionId=-6675950253085108747,java,serialization,Java,Serialization,在下面的场景中,我使用InvalidClassException创建了一个结构。在这里,我的EAR安装在4个Websphere应用程序服务器中,并在这些服务器之间共享执行。有时我从POJO类得到异常InvalidClassException,它实现了可序列化接口。请告诉我这方面的任何线索。关于这一点我没有任何线索。当您尝试反序列化使用同一类的不兼容(通常更早)版本序列化的对象时,会出现该异常 如果未在实现可序列化的类中显式指定serialVersionUID,则将基于类的(非瞬态)字段生成一个值

在下面的场景中,我使用InvalidClassException创建了一个结构。在这里,我的EAR安装在4个Websphere应用程序服务器中,并在这些服务器之间共享执行。有时我从POJO类得到异常InvalidClassException,它实现了可序列化接口。请告诉我这方面的任何线索。关于这一点我没有任何线索。

当您尝试反序列化使用同一类的不兼容(通常更早)版本序列化的对象时,会出现该异常

如果未在实现可序列化的类中显式指定
serialVersionUID
,则将基于类的(非
瞬态
)字段生成一个值。这样做是为了确保不恢复任何部分对象(与其盲目地继续使用可能已损坏的对象,不如失败)

在web应用程序系统中,序列化的一个常见用法是用于会话:如果您将值放入会话中,它很可能最终会被序列化(用于集群支持或只是为了获得持久会话)


因此,要么保持所有类在版本之间的兼容性,要么确保不还原它们不会破坏应用程序(即,不要以这种方式存储重要信息)。

当实现java.io.Serializable接口以使类可序列化时,编译器会查找名为“serialVersionUID”的静态最终字段长型的。如果类没有显式声明此字段,那么编译器将创建一个此类字段,并为其分配一个值,该值来自与实现相关的serialVersionUID计算。此计算取决于类的各个方面,并遵循Sun给出的对象序列化规范。但是,不能保证所有编译器实现中的值都相同

此值用于检查类与序列化的兼容性,这是在反序列化保存的对象时完成的。序列化运行时验证发送方类(用于保存流上对象的状态)和接收方类(用于还原对象的类,可能在其他系统中)的serialVersionUID是否完全相同。如果接收方系统加载的类的SerialVersionId与序列化过程中使用的类的SerialVersionId不同,那么我们会得到InvalidClassException

注-- 强烈建议您在所有要使其可序列化的类中显式声明并初始化long类型的、名为“serialVersionUID”的静态最终字段,而不是依赖此字段值的默认计算。此计算非常敏感,并且可能因编译器实现的不同而不同,因此即使对于同一个类,您也可能会得到InvalidClassException,这仅仅是因为您在序列化过程的发送方和接收方端使用了不同的编译器实现


在大多数情况下,您将仅对该字段使用“private”访问说明符,因为声明通常仅适用于声明它的类,我们实际上不需要在子类中继承该字段,也不需要从外部访问它。因此,我们几乎没有理由不将其保留为“私有”状态。

如果有人再次提出与EJB TimerTask相关的问题,就像我刚才所做的那样,如果您正在使用WebSphere Application Server,这里有一个提示:

概要文件的bin文件夹中有2个批处理文件/shell脚本,可以列出和删除EJB计时器任务。在我的例子中,我有一些计时器任务,这些任务使用不同的过期serialVersionUID序列化对象。我无法摆脱它们,因为序列化对象确实发生了变化。所以我就用了这些:

findEJBTimers.bat cancelejbtimes.bat


您的计时器任务和错误消息都将消失。就我而言,这正是我所需要的,但很难获得这些信息。

好的,我会给出一个例子和我的文章:

以及POJO的各种序列化形式的性能指标

您必须在性能和方便性之间进行权衡。但是,既然我说“JSON”是一种序列化方法,那么这里有一个不依赖于编译器的简单示例。基本上,除非您在接收端更改pojo的结构,否则编译pojo的时间/方式/位置完全不相关(事实上,它甚至不必在两个JVM之间)。从链接中可以看到,JSON实际上是速度最慢的,而XML只是一个负载猪。但它们都具有获得普遍支持的决定性优势。XML甚至允许应用样式表

InvalidClassException: local class incompatible: stream classdesc serialVersionUID = -196410440475012755, local class serialVersionUID = -6675950253085108747 输出

  @Test
    public void testJSON() throws Exception {
        Foo expected = new Foo(1,"Christian",1000000.00d);
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String testJson = gson.toJson(expected);

        System.out.println(testJson);

        Foo result = gson.fromJson(testJson, Foo.class);
        assertEquals(expected,result);

    }

    public static class Foo {

        private String name;
        private Integer age;
        private Double paycheck;

        public Foo(Integer age, String name, Double paycheck) {
            this.age = age;
            this.name = name;
            this.paycheck = paycheck;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            Foo foo = (Foo) o;

            if (age != null ? !age.equals(foo.age) : foo.age != null) return false;
            if (name != null ? !name.equals(foo.name) : foo.name != null) return false;
            if (paycheck != null ? !paycheck.equals(foo.paycheck) : foo.paycheck != null) return false;

            return true;
        }

        @Override
        public int hashCode() {
            int result = name != null ? name.hashCode() : 0;
            result = 31 * result + (age != null ? age.hashCode() : 0);
            result = 31 * result + (paycheck != null ? paycheck.hashCode() : 0);
            return result;
        }
    }

序列化对象时,serialVersionUID将与其他内容一起序列化

稍后反序列化时,将从反序列化对象中提取serialVersionUID,并与加载类的serialVersionUID进行比较


如果数字不匹配,则抛出InvalidClassException。

您好,非常感谢您的回复。正如您所提到的,序列化uid是特定于编译器的。但在这里,我的编译器版本在所有系统中都是相同的,而且它是断断续续发生的。我不确定接下来会发生什么。。。我建议你检查谷歌上的相关链接,并尝试将你的代码与它们联系起来。当你得到一些东西时,一定要发表评论。(很好,请看banglore的somone,我来自pune。)我现在面临着同样的问题,编译器版本不匹配是唯一的原因吗?我有java 1.6.29和1.6.23版本在两台计算机上,即开发和发布machine@Akhilesh这真的很难说,但是
  @Test
    public void testJSON() throws Exception {
        Foo expected = new Foo(1,"Christian",1000000.00d);
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String testJson = gson.toJson(expected);

        System.out.println(testJson);

        Foo result = gson.fromJson(testJson, Foo.class);
        assertEquals(expected,result);

    }

    public static class Foo {

        private String name;
        private Integer age;
        private Double paycheck;

        public Foo(Integer age, String name, Double paycheck) {
            this.age = age;
            this.name = name;
            this.paycheck = paycheck;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            Foo foo = (Foo) o;

            if (age != null ? !age.equals(foo.age) : foo.age != null) return false;
            if (name != null ? !name.equals(foo.name) : foo.name != null) return false;
            if (paycheck != null ? !paycheck.equals(foo.paycheck) : foo.paycheck != null) return false;

            return true;
        }

        @Override
        public int hashCode() {
            int result = name != null ? name.hashCode() : 0;
            result = 31 * result + (age != null ? age.hashCode() : 0);
            result = 31 * result + (paycheck != null ? paycheck.hashCode() : 0);
            return result;
        }
    }
{
  "name": "Christian",
  "age": 1,
  "paycheck": 1000000.0
}