Закрытие ObjectOutputStream / ObjectInputStream и NotActiveException В задаче есть условия: 2. В методе writeObject(ObjectOutputStream out) не должен быть вызван метод close у потока полученного в качестве параметра. 3. В методе readObject(ObjectInputStream in) не должен быть вызван метод close у потока полученного в качестве параметра. Приведу код этих методов:
private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.close();
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        stream = new FileOutputStream(fileName, true);
        in.close();
}
Вроде бы сами условия выглядят логично — если мы закроем потоки сериализации в методах записи/чтения объектов, то последующая работа с этими потокам (а соответственно и последующая сериализация) будет невозможна. В то же время я оставил методы close потоков в методах writeObject / readObject и написал такой код тестирования в main:
public static void main(String[] args) throws Exception {
        Solution solution1 = new Solution("1.txt");
        Solution solution2 = new Solution("2.txt");
        Solution solution3 = new Solution("3.txt");

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(solution1);
        oos.writeObject(solution2);
        oos.close();
        baos.close();
        oos.writeObject(solution3);

        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        Solution newSolution1 = (Solution) ois.readObject();
        Solution newSolution2 = (Solution) ois.readObject();
        ois.close();
        bais.close();
        Solution newSolution3 = (Solution) ois.readObject();
    }
К моему удивлению этот код полностью оказывается рабочим. Как видим, после записи первого объекта oos.writeObject(solution1); (при этом по сути в методе writeObject должен закрываться поток сериализации) мы спокойно можем сериализовать второй объект oos.writeObject(solution2); Хотя в этом месте я ожидал получить NotActiveException Более того — после сериализации второго объекта я явно в main закрываю потоки записи:
oos.close();
baos.close();
и после этого спокойно сериализую третий объект:
oos.writeObject(solution3);
Далее все эти объекты без ошибок десериализуются и можно продолжать с ними работать (хотя в процессе десериализации я опять же неоднократно пытаюсь закрыть потоки из которых читаю). Так и не смог разобраться - получается методы закрытия потоков ObjectOutputStream.close и ObjectInputStream.close не вот прям сразу моментально закрывают потоки сериализации? Или вообще их не закрывают?