クラスが Externalizable を実装する場合、引数のないコンストラクターが必要であることはわかっていA
ますが、クラスにコンストラクターがない場合 (私のA
クラスのように)、java は空の引数なしのコンストラクターを提供します。では、なぜエラーが発生するのでしょうか。クラスに引数なしのコンストラクター ( public A() {}
)を明示的に追加すると、A
すべて問題ありません。
エラー:
スレッド「メイン」での例外 java.io.InvalidClassException: A; java.base/java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:159) に有効なコンストラクターがありません。 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594) の io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2061) java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430) のTest.main (Test.java:19) で
import java.io.*;
public class Test implements Serializable
{
public static void main(String[] args) throws IOException, ClassNotFoundException
{
// initiaizing
A a1 = new A();
// serializing
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(a1);
oos.close();
// deserializing
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
A a2 = (A) ois.readObject();
}
}
class A implements Externalizable
{
@Override
public void writeExternal(ObjectOutput objectOutput) throws IOException {}
@Override
public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {}
}