2012-04-09 5 views
12

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

+12

Хорошо, что происходит, когда вы ... попробуйте? –

+1

мое приложение работает нормально, когда я это делаю. Но для этого я сериализую как внутренние, так и внешние классы, которые мне не нужны, но я знаю понятие, если внутренний класс сериализуется, а затем внешний должен быть сериализован. А также, у меня есть некоторые сомнения в статических классах, которые могут быть сериализованы или нет. – Tinkerbel

+0

Внешний класс не имеет ничего общего с сериализацией внутреннего класса _static_. –

ответ

18

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

+1

Спасибо всем, ребята. Я получил то, что мне нужно от вас, людей. – Tinkerbel

0

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

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

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

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

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

+3

Это не относится к вопросу, который указывает ** статические ** внутренние классы. – gerardw

1

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

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

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

+0

Будет полезно, если кто-нибудь сможет объяснить, почему?Я это заметил, но у меня нет очень убедительной причины ... Похоже, всякий раз, когда пакет меняется, это должно произойти – user2674407

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