即使使用serialVersionUID,也会出现java.io.InvalidClassException

时间:2015-05-10 17:01:07

标签: java serialization rmi java-io

我是RMI的新手。从java文档中我发现当本地和远程文件之间的串行版本不匹配时会抛出InvalidClassException。但我写了一个虚拟类,即使静态创建serialVersionUID

,也会抛出InvalidClassException
  package com.sac.serialization;

  import java.io.*;
  import java.util.*;

  class ClassA // non-serializable parent class
  {
      String parentname;

      // absence of no-arg constructor
      ClassA(String name) {
          parentname = name;
      }
  }

  class ClassB extends ClassA implements Serializable {
      private static final long serialVersionUID = 1L;

      ClassB(String name) {
          super(name);
      }
  }

  public class ClassC {
      public static void main(String args[]) {
          ClassB c1 = new ClassB("Sachin");
          try {
              ObjectOutputStream out = new ObjectOutputStream(
                  new FileOutputStream("employee.dat"));
              out.writeObject(c1);
              out.close();

              ObjectInputStream in = new ObjectInputStream(
                  new FileInputStream("employee.dat"));
              ClassA p = (ClassB) in.readObject();
              in.close();
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
  }

有些身体可以帮我找到根本原因吗?

1 个答案:

答案 0 :(得分:2)

ClassA必须有一个没有参数的可访问构造函数。可序列化类的最近的非可序列化基类必须具有不带派生类可访问的参数的构造函数。请参阅Serialization Specification