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);

Carこれは、存在しCar()ていて可視性があるパッケージとは異なるパッケージから発生するため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 に答える