Подтвердить что ты не робот

Сериализация статического внутреннего класса

Можно ли сериализовать статический внутренний класс в Java? Сам класс объявляется как статический.

4b9b3361

Ответ 1

Статический внутренний класс не отличается от класса верхнего уровня в этом отношении: он может быть сериализован, если он объявлен для реализации Serializable (или является подклассом класса, объявленного для реализации Serializable). Кроме того, как и классы верхнего уровня, все объекты, встречающиеся во время сериализации во время выполнения, должны быть сериализованы, чтобы избежать NotSerializableException. Поскольку внутренний класс static, природа внешнего класса не имеет к этому отношения.

Ответ 2

@Tinkerbel что-то отметить -

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

Все поля присваиваются по умолчанию/null.

Ответ 3

Кажется, ответ может отличаться от версии Java.

В спецификации сериализации JDK 7 говорится:

Примечание. Сериализация внутренних классов (т.е. вложенных классов, которые не являются статическими классами-членами), включая локальные и анонимные классы, настоятельно не рекомендуется по нескольким причинам. Поскольку внутренние классы, объявленные в нестатических контекстах, содержат неявные непереходные ссылки на включение экземпляров класса, сериализация такого внутреннего экземпляра класса приведет к сериализации связанного с ним экземпляра внешнего класса. Синтетические поля, созданные javac (или другими компиляторами JavaTM) для реализации внутренних классов, зависят от реализации и могут различаться между компиляторами; различия в таких полях могут нарушить совместимость, а также привести к конфликтующим значениям serialVersionUID по умолчанию. Имена, назначенные локальным и анонимным внутренним классам, также зависят от реализации и могут различаться между компиляторами. Поскольку внутренние классы не могут объявлять статические члены, кроме полей постоянной времени компиляции, они не могут использовать механизм serialPersistentFields для обозначения сериализуемых полей. Наконец, поскольку внутренние классы, связанные с внешними экземплярами, не имеют конструкторов с нулевым аргументом (конструкторы таких внутренних классов неявно принимают включенный экземпляр в качестве предварительного параметра), они не могут реализовать Externalizable. Однако ни одна из перечисленных выше проблем не применяется к статическим классам-членам.

и из опыта сериализации объектов между версиями Oracle и IBM JDK 1.7 могу сказать, что он не всегда работает. Я не могу сказать, что он всегда терпит неудачу, но вы не можете рассчитывать на его работу.

Путь к коду, который не работает в моем приложении, отлично работал на JDK 1.5 в течение 5 лет в производстве, и я ничего не вижу в предыдущей документации по сериализации, напоминающей текущую инструкцию. Итак, кажется, что богам Java разрешен этот код в JDK 7.