2009-07-31 9 views
6

Ce matin, mon patron et moi avons eu une discussion longue et infructueuse à ce sujet, dans le contexte d'essayer de diagnostiquer des problèmes de performances avec une application web. Nous n'avons pas vraiment tiré de conclusions.Quels sont les problèmes avec les classes internes non statiques et la sérialisation en Java

Je pense que nous avons raison de penser que les classes internes non-statiques sérialisables ont des problèmes, mais nous ne savons pas exactement quels sont les problèmes ou quoi exactement éviter (nous avons pensé que nous ne pouvions pas simplement l'éviter). Quelqu'un peut-il suggérer des lignes directrices pour ne pas avoir des ennuis avec ce problème?

+2

Vous avez vraiment besoin de clarifier ce que la question est que vous avez rencontré. Les classes étant (ou n'étant pas) Serializable en soi n'est certainement pas un problème - ce qui importe est ce que vous faites avec eux. Avez-vous profilé votre application? Où était le hold-up principal? – ChssPly76

Répondre

7

Une classe interne contient une référence à sa classe externe, donc la tentative de sérialisation de l'interne sérialisera également l'objet externe - ainsi que tous les autres objets que l'externe pourrait contenir. Cela pourrait entraîner un énorme graphe d'objets. Ou il peut échouer, si l'extérieur a un état qui ne peut pas être sérialisé (comme un objet InputStream). Cela dit, il y a des moments où vous devez faire des classes internes Serializable, même si vous n'envisagez jamais de les sérialiser. Par exemple, si vous travaillez avec Swing.

Si vous envisagez de sérialiser ces objets, je vous demanderais pourquoi ils devraient être des classes internes indépendamment des performances. Généralement, vous allez uniquement sérialiser les conteneurs de données, et de tels conteneurs ont rarement (voire jamais) besoin d'une référence à une classe "parent". Pensez à faire de ces objets des classes (statiques) imbriquées plutôt que des classes internes. Le simple fait d'être conscient qu'une classe interne sérialisée possède une référence implicite à son objet conteneur ira un long chemin.

3

Cette référence a un certain nombre de conséquences:

  • La référence est généré automatiquement, donc il ne peut pas être transient
  • La classe extérieure doit être sérialisable
  • La classe externe sera automatiquement sérialisé avec l'intérieur classe
  • l'objet extérieur ne peut être dissociée de son objet interne

Probablement la ligne directrice principale, je peux draguer est « ne sérialise pas les classes internes ex cept de leur objet contenant. " Je ne peux pas penser à plus de pièges.

0

Une pensée. Si votre classe externe inclut une collection (non transitoire) d'instances de la classe interne, chaque fois que vous sérialiserez l'une des instances de la classe interne, vous les intégrerez dans la sérialisation.

+0

Le mécanisme de sérialisation Java est assez intelligent pour savoir quand un objet a déjà été écrit dans un flux, et les références suivantes à cet objet utilisent un ID. Cela vous permet de reconstruire un graphique d'objet et de conserver son identité dans le graphique. – kdgregory

Questions connexes