2009-07-31 11 views
6

Esta mañana mi jefe y yo tuvimos una discusión larga y en última instancia infructuosa sobre esto, en el contexto de tratar de diagnosticar problemas de rendimiento con una aplicación web. Realmente no llegamos a ninguna conclusión.¿Cuáles son los problemas con las clases internas no estáticas y serialización en Java

creo que estamos en lo cierto al pensar que las clases internas no estáticos Serializable tienen problemas, pero no estamos seguros exactamente cuáles son los problemas o qué es exactamente para evitar (que razonó que no podíamos siempre simplemente evitarlo). ¿Alguien puede sugerir alguna guía para no tener problemas con este problema?

+2

que realmente necesita para aclarar cuál es el problema que le ha surgido. Las clases que son (o no son) Serializables per se definitivamente no son un problema, lo que importa es lo que estás haciendo con ellas. ¿Hiciste un perfil de tu aplicación? ¿Dónde estaba el atraco principal? – ChssPly76

Respuesta

7

Una clase interna contiene una referencia a su clase externa, por lo que intentar serializar el interior también serializará el exterior, así como cualquier otro objeto que pueda contener el exterior. Esto podría generar un gran gráfico de objetos. O podría fallar, si el exterior tiene un estado que no se puede serializar (como un objeto InputStream).

Dicho esto, hay ocasiones en las que tiene que hacer que las clases internas sean serializables, incluso si nunca planea serializarlas. Por ejemplo, si estás trabajando con Swing.

Si planea serializar estos objetos, me pregunto por qué tendrían que ser clases internas independientemente de su rendimiento. En general, solo vas a serializar contenedores de datos, y tales contenedores rara vez (si es que alguna vez) necesitan una referencia a alguna clase "padre". Considere la posibilidad de hacer que estos objetos sean clases anidadas (estáticas) en lugar de clases internas.

3

Solo tener en cuenta que una clase interna serializada tiene una referencia implícita a su objeto contenedor será de gran utilidad. Esta referencia tiene una serie de implicaciones:

  • se genera automáticamente la referencia, por lo que no puede ser transient
  • La clase externa debe ser serializable
  • La clase externa será serializado automáticamente con el interior
  • clase
  • el objeto externo no puede disociarse de su objeto interno

Probablemente la principal directriz que puedo sacar a relucir es "no serializar clases internas ex cept de su objeto que contiene ". No se me ocurre nada más.

0

Un pensamiento. Si su clase externa incluye una colección de instancias (no transitorias) de la clase interna, cada vez que serialice una de las instancias de clases internas, realmente las incorporará a la serialización.

+0

El mecanismo de serialización de Java es lo suficientemente inteligente como para saber cuándo un objeto ya se ha escrito en una secuencia, y las referencias posteriores a ese objeto usan una ID. Esto le permite reconstruir un gráfico de objetos y retener la identidad dentro del gráfico. – kdgregory

Cuestiones relacionadas