2009-07-31 12 views
6

Questa mattina il mio capo e io abbiamo avuto una discussione lunga e in definitiva infruttuosa su questo, nel contesto del tentativo di diagnosticare problemi di prestazioni con un'applicazione web. Non abbiamo davvero raggiunto alcuna conclusione.Quali sono i problemi con le classi interne non statiche e la serializzazione in Java

penso che noi abbiamo ragione di pensare che le classi interne non statici Serializable hanno problemi, ma non siamo sicuri esattamente quali sono i problemi o che cosa esattamente da evitare (abbiamo concluso che non potevamo sempre semplicemente evitarlo). Qualcuno può suggerire alcune linee guida per non avere problemi con questo problema?

+2

si ha realmente bisogno di chiarire qual è il problema che hai incontrato. Classi di essere (o non essere) Serializable di per sé non è sicuramente un problema - ciò che conta è ciò che stai facendo con loro. Hai profilato la tua domanda? Dov'era il principale holdup? – ChssPly76

risposta

7

Una classe interna contiene un riferimento alla sua classe esterna, pertanto il tentativo di serializzare l'interno serializzerà anche l'esterno - così come qualsiasi altro oggetto che potrebbe contenere l'esterno. Ciò potrebbe comportare un enorme oggetto grafico. Oppure potrebbe fallire, se l'esterno ha uno stato che non può essere serializzato (come un oggetto InputStream).

Detto questo, ci sono volte in cui è necessario rendere serializzabili le classi interne, anche se non si prevede di serializzarle. Ad esempio, se stai lavorando con Swing.

Se si pianifica di serializzare questi oggetti, mi chiederei perché avrebbero bisogno di essere classi interne indipendentemente dalle prestazioni. In genere, serializzate solo i contenitori di dati, e tali contenitori raramente (se mai) necessitano di un riferimento ad alcune classi "parent". Considera di rendere queste classi nidificate (statiche) piuttosto che le classi interne.

3

Il solo fatto di essere consapevoli che una classe interna serializzata ha un riferimento implicito al suo oggetto contenitore farà molta strada. Questo riferimento ha una serie di implicazioni:

  • Il riferimento viene generato automaticamente, quindi non può essere transient
  • La classe esterno deve essere serializzabili
  • classe esterna verrà serializzato automaticamente con l'interno classe
  • l'oggetto esterno non può essere dissociato dal suo oggetto interno

Probabilmente la linea guida principale che posso dragare è "non serializzare classi interne ex indipendentemente dal loro oggetto di contenimento. " Non riesco a pensare ad altri trucchi.

0

Un pensiero. Se la tua classe esterna include una raccolta (non transitoria) di istanze della classe interna, allora ogni volta che serializzi una delle istanze della classe interna, le estrarrai tutte nella serializzazione.

+0

Il meccanismo di serializzazione Java è abbastanza intelligente da sapere quando un oggetto è già stato scritto in un flusso e i successivi riferimenti a tale oggetto utilizzano un ID. Ciò consente di ricostruire un grafico oggetto e conservare l'identità all'interno del grafico. – kdgregory

Problemi correlati