3

Хотя я в настоящее время не планирую сериализовать что-либо, я предоставляю все сериализуемые внешние классы, а также статические вложенные классы SerialVersionUID, потому что это правильный способ сделать это.Java: Должны ли сериализуемые внутренние и анонимные классы иметь SerialVersionUID?

Однако, я прочитал, что here

Сериализация внутренних классов (то есть, вложенных классов, которые не являются статическими классами членов), включая местные и анонимные классы, настоятельно не рекомендуется по нескольким причинам. ...

Так что мой вопрос:

Должен ли я дать внутренние и анонимные классы в SerialVersionUID каждый, или я должен добавить @SuppressWarnings("serial") тем?

Один из способов более правильный, чем другой?

Я в любом случае сделаю ссылки на такие классы переходными, потому что я не хочу, чтобы они были сериализованы.

+0

Я думаю, что советы о том, что вы не должны сериализовать тезисы классов, обескуражены, потому что вы не знаете, что JVM, десериализующий объекты, имеет классы в пути к классам. – keuleJ

+0

Итак, я должен рассматривать их как другие сериализуемые классы? –

+0

Я бы использовал только serialVersionUID, если вам нужна совместимость между версиями. например. если вы пишете объекты в файле или аналогичные. – keuleJ

ответ

3

Дайте им serialVersionUID, потому что:

  • Это хорошая общая практика, и это, конечно, не помешает указать.
  • Предупреждения следует решать, а не подавлять.
  • Иногда внутренние классы меняются, чтобы быть классами верхнего уровня, когда они становятся достаточно большими.

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

+0

Я думаю, я не пойду так далеко, чтобы добавить методы writeObject в каждый внутренний класс. Тем более, что некоторые (в основном анонимные классы) должны быть как можно короче, для большей аккуратности. Но я добавлю SerialVersionUID как минимум. –

+0

@Lonenebula Обычно вам не нужно добавлять 'writeObject()' etc методы, если у вас уже нет проблемы с сериализацией. – EJP

Смежные вопросы