нужны - статические классы java




Почему сериализуемый внутренний класс не сериализуем? (2)

Следующий код:

public class TestInnerClass {

    public static void main(String[] args) throws IOException {
        new TestInnerClass().serializeInnerClass();
    }

    private void serializeInnerClass() throws IOException {
        File file = new File("test");
        InnerClass inner = new InnerClass();
        new ObjectOutputStream(new FileOutputStream(file)).writeObject(inner);
    }

    private class InnerClass implements Serializable {

        private static final long serialVersionUID = 1L;

    }

}

выдает следующее исключение:

Exception in thread "main" java.io.NotSerializableException: TestInnerClass

Я предполагаю, что у внутреннего класса есть поле TestInnerClass.this которое разрешает ему частный доступ к полям и методам TestInnerClass . Объявление статического внутреннего класса решает это , но что, если InnerClass нуждается в этом доступе? Есть ли способ сериализации нестатического внутреннего класса без включающего класса, например, путем создания ссылки на внешний класс transient ?

редактировать: например, доступ к внешнему классу может быть необходим только перед сериализацией. Хорошо, компилятор не может этого знать, но я подумал, что именно поэтому существует transient ключевое слово.


что если InnerClass нужен этот доступ?

Тогда ему нужен экземпляр внешнего класса, и он должен быть сериализован вместе с внутренним классом.

Есть ли способ сериализации нестатического внутреннего класса без включающего класса, например, путем создания ссылки на внешний класс переходным?

Нет. Что произойдет, если вы десериализуете такой класс, а затем попытаетесь вызвать метод экземпляра внешнего класса? NullPointerException ?


InnerClass не может быть сериализован, потому что для его создания (как требуется при десериализации) вам нужна ссылка на экземпляр внешнего класса

Экземпляры внутренних классов не могут существовать без экземпляра внешнего класса.

т.е.

OuterClass o = new OuterClass();
OuterClass.InnerClass o_i = o.new InnerClass();

Если вы используете статический внутренний класс, станет возможным сериализовать статический внутренний класс. Экземпляры статических внутренних классов могут быть созданы автономно.

т.е.

OuterClass o = new OuterClass();
OuterClass.InnerClass i = new OuterClass.InnerClass();




inner-classes