2012-04-09 25 views
12

¿Podemos serializar una clase interna estática en Java? La clase en sí se declara estática aquí.Serialización de clase interna estática

+12

Bueno, ¿qué pasa cuando ... lo intentas? –

+1

mi aplicación está funcionando bien cuando hago esto. Pero, para que esto suceda, estoy serializando tanto las clases internas como las externas, lo cual no es necesario para mí, pero conozco el concepto de si la clase interna está serializada y luego la externa debe ser serializada. Y también, tengo algunas dudas en las clases estáticas que pueden serializarse o no. – Tinkerbel

+0

La clase externa no tiene nada que ver con la serialización de una clase interna _static_. –

Respuesta

18

Una clase interna estática no es diferente de una clase de nivel superior a este respecto: se puede serializar si se declara que implementa Serializable (o es una subclase de una clase declarada para implementar Serializable). Además, al igual que con las clases de nivel superior, todos los objetos encontrados durante la serialización en tiempo de ejecución deben ser serializables para evitar un NotSerializableException. Como la clase interna es static, la naturaleza de la clase externa es irrelevante para esto.

+1

Gracias All Guys. Obtuve lo que necesitaba de ustedes, gente. – Tinkerbel

0

Parece que la respuesta puede variar según la versión de Java ahora.

La especificación serialización en JDK 7 dice:

Nota - serialización de clases internas (es decir, las clases anidadas que no son clases miembro estáticas), incluyendo clases locales y anónimas, se desaconseja encarecidamente por varias razones. Debido a que las clases internas declaradas en contextos no estáticos contienen referencias implícitas no transitorias para adjuntar instancias de clase, la serialización de dicha instancia de clase interna dará como resultado la serialización de su instancia de clase externa asociada también. Los campos sintéticos generados por javac (u otros compiladores JavaTM) para implementar clases internas dependen de la implementación y pueden variar entre compiladores; las diferencias en tales campos pueden interrumpir la compatibilidad y dar como resultado valores conflictivos de serialVersionUID por defecto. Los nombres asignados a las clases internas locales y anónimas también dependen de la implementación y pueden diferir entre los compiladores. Como las clases internas no pueden declarar miembros estáticos que no sean campos constantes en tiempo de compilación, no pueden usar el mecanismo serialPersistentFields para designar campos serializables. Finalmente, dado que las clases internas asociadas a las instancias externas no tienen constructores de argumento cero (los constructores de dichas clases internas aceptan implícitamente la instancia adjunta como un parámetro antepuesto), no pueden implementar Externalizable. Ninguno de los problemas enumerados anteriormente, sin embargo, se aplica a clases de miembros estáticos.

y por la experiencia de serialización de objetos entre las versiones Oracle e IBM JDK 1.7, puedo decirle que no siempre funciona. No puedo asegurar que siempre falle, pero seguro que no puede contar con que funcione.

La ruta del código que no está fallando en mi aplicación funcionó bien en JDK 1.5 durante 5 años en producción y no veo nada en la documentación previa sobre la serialización que se asemeja a la declaración actual. Por lo tanto, parece que los dioses han Java se permite que este patrón de código en el JDK 7.

+3

Esto no es relevante para la pregunta, que especifica clases internas ** estáticas **. – gerardw

1

@Tinkerbel algo a tener en cuenta -

serialización de clases anidadas estáticas está bien, pero cuando (en el futuro) si las clases internas estáticas son cada vez movido a una clase externa diferente, entonces de serializar los objetos viejos es un problema.

Todos los campos están asignados por defecto/nulo.

+0

Será útil si alguien puede explicar por qué?Lo he observado pero no tengo una razón muy convincente ... Parece que cada vez que se cambia un paquete esto debería suceder – user2674407

Cuestiones relacionadas