Получение InvalidClassException - PullRequest
1 голос
/ 29 января 2020
import java.io.*;

public class StaticVariableTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        AC AC = new AC();
        AC.b = 25;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(AC);
        oos.flush();
        oos.close();
        bos.close();

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        AC na = (AC) ois.readObject();

        System.out.println(na.b);


    }
}

class AC implements Externalizable {
    private static final long serialVersionUID = 1L;
    int b = 20;

    @Override
    public void writeExternal(ObjectOutput objectOutput) throws IOException {
    }

    @Override
    public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {
    }
}

Почему в указанной выше программе я получаю InvalidClassException?

Исключение в потоке "main" java .io.InvalidClassException: serializationExamples.AC; нет допустимого конструктора в java .base / java .io.ObjectStreamClass $ ExceptionInfo.newInvalidClassException (ObjectStreamClass. java: 159) в java .base / java .io.ObjectStreamClass.checkDeserialize (ObjectStreamClass. java: 864) в java .base / java .io.ObjectInputStream.readOrdinaryObject (ObjectInputStream. java: 2061) в java .base / java .io.ObjectInputStream.readObject0 (ObjectInputStream. java: 1594) в java .base / java .io.ObjectInputStream.readObject (ObjectInputStream. java: 430) в serializationExamples.StaticVariableTest.main (StaticVariableTest. java: 18)

В нем говорится, что нет допустимого конструктора, но конструктор по умолчанию без аргументов должен был быть предоставлен java для класса A.

1 Ответ

5 голосов
/ 29 января 2020

Из Javado c:

Когда реконструируется объект Externalizable, экземпляр создается с помощью конструктора publi c без аргументов

У вас нет общедоступного c конструктора без аргументов, поскольку класс не публикуется c.

С JLS 8.8.9 Конструктор по умолчанию :

Конструктор по умолчанию имеет тот же модификатор доступа, что и класс, если только в классе отсутствует модификатор доступа, и в этом случае конструктор по умолчанию имеет доступ к пакету (§6.6).

...