Что является проблемами с нестатическими внутренними классами и сериализацией в Java

Я использую настроенную версию Автор DX . Я нашел простым использовать, чрезвычайно легкий изменить, и это имеет руководство пользователя (с яркими примерами) , который очень похож для Кодирования Воспламенителя.

6
задан akarnokd 31 July 2009 в 16:47
поделиться

4 ответа

Простое знание того, что сериализованный внутренний класс имеет неявную ссылку на содержащий его объект, будет иметь большое значение. Эта ссылка действительно имеет ряд значений:

  • Ссылка создается автоматически, поэтому она не может быть переходной
  • Внешний класс должен быть сериализуемым
  • Внешний класс будет автоматически сериализован с внутренним class
  • Внешний объект не может быть отделен от своего внутреннего объекта

Вероятно, главный принцип, который я могу усвоить, - это «не сериализовать внутренние классы, кроме как из содержащих их объектов». Я не могу вспомнить больше подводных камней.

3
ответ дан 10 December 2019 в 00:42
поделиться

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

0
ответ дан 10 December 2019 в 00:42
поделиться

Внутренний класс содержит ссылку на свой внешний класс, поэтому попытка сериализации внутреннего также будет сериализовать внешний - а также любые другие предметы, которые может удерживать внешний. Это могло привести к огромному графу объекта. Или он может выйти из строя, если внешний объект имеет состояние, которое не может быть сериализовано (например, объект InputStream).

Тем не менее, бывают случаи, когда вам нужно сделать внутренние классы сериализуемыми, даже если вы никогда не планируете их сериализовать . Например, если вы работаете с Swing.

Если вы действительно планируете сериализовать эти объекты, я бы задал вопрос, почему они должны быть внутренними классами независимо от производительности. Как правило, вы re будет только сериализовать контейнеры данных, и таким контейнерам редко (если вообще когда-либо) нужна ссылка на какой-то «родительский» класс. Попробуйте сделать эти объекты вложенными (статическими) классами, а не внутренними.

7
ответ дан 10 December 2019 в 00:42
поделиться

Вы можете сделать класс Externalizable и написать свои собственные методы writeExternal и readExternal, которые будут отправлять только те поля, которые вам нужны.

http://java.sun.com/javase/6/ docs / api / java / io / Externalizable.html

0
ответ дан 10 December 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: