当序列化运行时检测到类中的以下问题之一时抛出。
一共有三种会产生异常的问题和解决办法:

  • 类的串行版本与从流中读取的类描述符的类型不匹配
    解决办法:serialVersionUID 是 序列号
    如果我们自己没有定义,那么虚拟机会根据类中的信息会自动的计算出一个序列号。
    不让虚拟机帮我们自动计算,我们自己手动给出serialVersionUID,而且这个值不要变。
    给对象所属的类加一个下面的代码
    private static final long serialVersionUID = 1L;
    不要超过long的取值范围,随便写多少都行。
  • 实体类
public class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
//    private int age;
    private transient int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

  • 测试类
public class ObjectStreamDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
//        write();
        read();
    }

    //反序列化
    private static void read() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myOtherStream\\oos.txt"));
        Object obj = ois.readObject();
        Student s = (Student) obj;
        System.out.println(s.getName() + "," + s.getAge());
        ois.close();
    }

    //序列化
    private static void write() throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myOtherStream\\oos.txt"));
        Student s = new Student("佟丽娅", 30);
        oos.writeObject(s);
        oos.close();
    }
}

  • 该类包含未知的数据类型
    解决办法:检查数据类型是否定义。

  • 该类没有可访问的无参数构造函数
    解决办法:重新在实体类中创建一个无参构造

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐