2012-04-09 10 views
12

È possibile serializzare una classe interna statica in Java? La classe stessa è dichiarata statica qui.Serializzazione della classe interna statica

+12

Beh, cosa succede quando ... lo provi? –

+1

la mia applicazione funziona correttamente quando lo faccio. Ma, perché ciò accada, sto serializzando sia le classi interne che quelle esterne, che non è necessario per me, ma conosco il concetto se la classe interna è serializzata, quindi esterna deve essere serializzata. E inoltre, ho qualche dubbio nelle classi statiche che possono essere serializzate o meno. – Tinkerbel

+0

La classe esterna non ha nulla a che fare con la serializzazione di una classe interna _static_. –

risposta

18

Una classe interna statica non è diversa da una classe di livello superiore in questo senso: può essere serializzata se è dichiarata per implementare Serializable (o è una sottoclasse di una classe dichiarata per implementare Serializable). Inoltre, come con le classi di primo livello, tutti gli oggetti incontrati durante la serializzazione in fase di esecuzione devono essere serializzabili per evitare un NotSerializableException. Poiché la classe interna è static, la natura della classe esterna è irrilevante a questo.

+1

Grazie a tutti ragazzi. Ho avuto ciò di cui avevo bisogno da voi. – Tinkerbel

0

Sembra che la risposta possa variare a seconda della versione di Java ora.

Le specifiche serializzazione in JDK 7 dice:

Nota - serializzazione di classi interne (cioè, classi annidate che non sono le classi membro statiche), comprese le classi locali e anonime, è fortemente sconsigliato per diversi motivi. Poiché le classi interne dichiarate in contesti non statici contengono riferimenti impliciti non transienti per includere istanze di classe, la serializzazione di tale istanza di una classe interna comporterà anche la serializzazione della sua istanza di classe esterna associata. I campi sintetici generati da javac (o altri compilatori JavaTM) per implementare le classi interne dipendono dall'implementazione e possono variare tra i compilatori; le differenze in questi campi possono interrompere la compatibilità e comportare valori di serialVersionUID predefiniti in conflitto. Anche i nomi assegnati alle classi interne locali e anonime dipendono dall'implementazione e possono differire tra i compilatori. Poiché le classi interne non possono dichiarare membri statici diversi dai campi costanti in fase di compilazione, non possono utilizzare il meccanismo serialPersistentFields per designare campi serializzabili. Infine, poiché le classi interne associate alle istanze esterne non hanno costruttori con argomento zero (i costruttori di tali classi interne accettano implicitamente l'istanza che lo include come parametro anteposto), non possono implementare Externalizable. Nessuno dei problemi sopra elencati, tuttavia, si applica alle classi membro statiche.

e dall'esperienza di serializzazione di oggetti tra le versioni Oracle e IBM JDK 1.7, posso dirvi che non sempre funziona. Non posso dire con certezza che fallisca sempre, ma non si può certo contare sul fatto che funzioni.

Il percorso del codice che non ha esito negativo nella mia app ha funzionato bene su JDK 1.5 per 5 anni in produzione e non vedo nulla nella documentazione precedente sulla serializzazione simile alla dichiarazione corrente. Così, sembra gli dei Java hanno è permesso a questo modello di codice in JDK 7.

+3

Questo non è rilevante per la domanda, che specifica ** classi interne statiche **. – gerardw

1

@Tinkerbel qualcosa da notare -

serializzazione di classi annidate statiche è bene, ma quando (in futuro) se le classi interne statiche sono sempre spostati in una classe esterna diversa, quindi de serializzare i vecchi oggetti è un problema.

Tutti i campi sono assegnati come predefiniti/null.

+0

Sarà utile se qualcuno può spiegare perché?L'ho osservato, ma non ho una ragione molto convincente ... Sembra che ogni volta che un pacchetto viene cambiato, ciò dovrebbe accadere – user2674407