2012-07-22 18 views
31

Eventuali duplicati:
Why Java needs Serializable interface?Perché Java.lang.Object non implementa l'interfaccia serializzabile?

Secondo serializzabilità in docs Java:

serializzabilità di una classe è abilitata per la classe che implementa l' java.io.Serializable interfaccia. Le classi che non implementano questa interfaccia non avranno nessuno dei loro stati serializzati o deserializzati. Tutti i sottotipi di una classe serializzabile sono anch'essi serializzabili. L'interfaccia di serializzazione non ha metodi o campi e serve solo a individuare la semantica di essere serializzabile

Perché non l'oggetto già implementare Serializable? I membri che non vorremmo essere serializzabili possono essere creati come transient. Perché impedire la serializzazione di default?

+2

[Questa domanda] (http://stackoverflow.com/questions/441196/why-java-needs-serializable-interface) contiene alcune belle risposte che potrebbero interessarti. – Pshemo

+0

Infatti. Avrei dovuto provare parole chiave alternative prima di postare :) –

risposta

40

Tutti i sottotipi di una classe serializzabile sono anch'essi serializzabili.

In altre parole: tutte le classi mai create, sono stati o saranno creati sono tutti serializzabile. transient esclude solo i campi, non le intere classi.

Questo è un potenziale buco di sicurezza: per coincidenza puoi serializzare ad es. il tuo DataSource con credenziali di database all'interno - se il creatore di questa particolare implementazione DataSource ha dimenticato di creare tali campi transient. È sorprendentemente facile serializzare oggetti Java casuali, ad es. attraverso classi interne con riferimento implicito all'esterno this.

È semplicemente più sicuro utilizzare la white-list delle classi che desideri esplicitamente e consentire di serializzare anziché esaminare attentamente il codice, assicurandosi che nessun campo che non desideri venga mai serializzato.

Inoltre non è più possibile dire: MySuperSecretClass non è serializzabile (semplicemente non implementando Serializable) - è possibile escludere solo le budella (campi).

+0

OK, penso di essermi completamente perso l'aspetto della sicurezza. Ha senso. Ma non usiamo Privato/Pubblico/Protetto per l'accesso al tempo di compilazione? Non è stato possibile effettuare un transitorio o qualcosa di simile per il tempo di esecuzione? Solo per chiedere. O sarebbe stato semplicemente ingombrante. –

+3

@ TJ-: IMHO solo una piccola parte delle classi deve essere serializzabile (oggetti valore, DTO). Contrassegnare le classi che devono essere serializzabili è molto più conveniente che contrassegnare quelle che non lo prevedono. Non che Java non sia ingombrante in materia: ancora IMHO tutti i campi dovrebbero essere privati ​​e tutti i metodi pubblici di default, ma cosa si può fare? –

5

La maggior parte delle classi non deve essere serializzabile. Con il design attuale puoi facilmente notare che la classe è serializzabile. Essenzialmente si tratta solo di un'autocostruzione controllata dal compilatore. In caso contrario, si sarebbe probabilmente scrivere qualcosa di simile:

/** DON'T SERIALIZE IT!!! */ 
class Connection { ... } 

ed è meglio avere caratteristica del linguaggio o una libreria di commenti.

1

Penso che abbia più senso implementare Serializable per gli oggetti che devono essere persistenti e dichiarare che ogni campo della classe transiennt sarà più ingombrante. Un altro punto per il quale non sono sicuro è che Object è la radice di tutte le classi, che include le classi relative alla riflessione, quindi sarà inappropriato implementare Serializable per la classe Object.

13

1.Serializable è interfaccia marker, che è vuota, ma quando una classe è contrassegnata Serializable significa che i suoi oggetti sono serializzabili.

2. La ragione per la java.lang.Object non ha ancora implementare Serializable è dovuto al fatto, che cosa se NON si vuole fare in alcuni campi come serializzabile e il mio errore ha mancato di aggiungere transitoria a quel campo, allora sarà un il caos.

3. Facendo il programmatore implementare Serializable per la sua classe, rende la consapevolezza tra il programmatore che ha messo in atto consapevolmente, e dovrebbe prendere passo necessario per evitare che qualsiasi cosa per essere serializzato che non dovrebbe essere.