1

我试图将一个对象放入一个文件中,然后尝试使用 Externalizable 接口读取同一个对象,我得到一个异常,没有 Car 类的有效构造函数。

import java.io.*;
class Base
{
    int a;
}
class Car extends Base implements Externalizable
{
    static int b;
    String c="";

    Car(int d,int e,String f)
    {
        a=d;
        b=e;
        c=f;
    }
    Car()
{super();} 
        public void writeExternal(ObjectOutput oos)
        {
            try
            {
            oos.writeInt(a);
            oos.writeInt(b);
            oos.writeObject(c);
            }
            catch(Exception e){}
        }
        public void readExternal(ObjectInput ois)
        {
            try
            {
            a=ois.readInt();
            b=ois.readInt();
            c=(String)ois.readObject();
            }
            catch(Exception e){}
        }
    }
    class Main
    {
            public static void main(String args[])throws Exception
        {
            Car c1=new Car(1,2,"Manish");
            FileOutputStream fos=new FileOutputStream("man.txt");
            ObjectOutputStream oos=new ObjectOutputStream(fos);
            oos.writeObject(c1);
            FileInputStream fis=new FileInputStream("man.txt");
            ObjectInputStream ois=new ObjectInputStream(fis);
            Object o=ois.readObject();
            Car c2=(Car)o;
            System.out.println(c2.a+" "+c2.b+" "+c2.c);
        }
    }

有人可以解释错误是什么吗?

4

2 回答 2

1

主要问题是一个简单的事实:Externalization接口通过对象本身提供序列化。

这意味着对象本身有责任保存和恢复其状态,这意味着对象必须存在才能反序列化其内部的状态(通过readExternal)。

幕后发生的事情是序列化引擎分配对象的一个​​空实例然后调用readExternal它。

所以基本上发生的事情是这样的:

Car emptyCar = Car.class.newInstance();
emptyCar.readExternal(state);

由于这种情况发生在与所在包不同CarCar()具有default可见性的包中,因此引擎无法调用默认构造函数,因此会出现错误。

您必须提供public默认构造函数。

于 2015-08-29T09:01:14.927 回答
1

Java 序列化假设您有一个公共的默认构造函数。

一些库不做这个假设,但是内置的序列化做了。

顺便说一句,除非您确定这样做是安全的,否则您不应忽略异常。在你的情况下,你不需要抓住它们。

public void writeExternal(ObjectOutput oos) throws IOException {
    oos.writeInt(a);
    oos.writeInt(b);
    oos.writeObject(c);
}
于 2015-08-29T08:55:17.603 回答