2012-05-03 3 views
34

C'è una penalità da aggiungerePenalità per implementare Serializable in Java?

implements Serializable 

ad una classe Java? Impatto sulla dimensione dell'oggetto o delle prestazioni istanziati?

+1

http://www.javalobby.org/java/forums/t88856.html –

+2

Questo collegamento ha 5 anni. – adarshr

+3

È il concetto? –

risposta

24

Il costo è vicino allo zero, non vale la pena preoccuparsi.

Alcuni ulteriori dettagli:

  • Non v'è alcun aumento delle dimensioni di ogni oggetto esempio
  • C'è un piccolo aumento nella dimensione della classe stessa, ma questo è un costo una tantum è banale quando viene ammortizzato su un gran numero di istanze
  • Ci può essere un leggero costo aggiuntivo di runtime per tutto ciò che deve fare controlli di interfaccia in fase di esecuzione (riflessione, instancof ricerche, ulteriore pressione su cache in linea ecc.). Ancora una volta, questo è probabilmente trascurabile per la maggior parte degli scopi.
  • Serializable è un'interfaccia marker , non ci sono metodi che richiedono di essere implementati. Altri esempi di interfaccia marker sono: Clonable, SingleThreadModel, Listener di eventi.
24

A meno che tu/qualcun altro non si serializzi/deserializzi effettivamente, non ci sarà alcun impatto. Serializable è solo un'interfaccia marcatore.

Probabilmente aumenterà solo la dimensione del bytecode generato di alcuni byte.

+0

Grazie, ho pensato anch'io. – AChoice

24

Nessun impatto sulle prestazioni a meno che non si esegua la serializzazione/deserializzazione, ma ci sono dei compromessi in termini di design delle API.

Da Effective java da Joshua Bloch

  • Un costo maggiore di attuazione Serializable è che esso riduce la flessibilità per cambiare implementazione di una classe una volta che è stato rilasciato
  • Un secondo costo di attuazione Serializable è che aumenta la probabilità di bug e falle di sicurezza
  • Un terzo costo di implementazione Serializable è che aumenta il carico di testing associato al rilascio di una nuova versione di una classe

Fino a che punto questi sono applicabili dipendono dal vostro caso.

+0

Non c'è alcun impatto sulle prestazioni anche se * si * esegue la serializzazione/deserializzazione, perché se non si implementa 'Serializable' non è possibile farlo affatto, quindi non c'è nulla con cui confrontarlo. – EJP

+0

Grazie per Joshua-quote. Sono d'accordo. – AChoice

+0

Onestamente non implementerei Serializable senza aver prima letto il libro Effective Java. –

0

Serializable è solo un'interfaccia "marcatore". Non richiede l'implementazione di alcun metodo.

L'unica cosa è che è consigliabile avere un static final long serialVersionUID per aiutare l'API di serializzazione. Ciò costa un singolo valore long per classe serializzata.

Si potrebbe voler controllare this article about Java Serialization API. Descrive la maggior parte degli avvertimenti di serializzazione/deserializzazione in dettaglio.

1

È necessario considerare sempre l'overhead di manutenzione.Il costo di un'applicazione distribuita sul suo live può essere più volte il costo di svilupparlo.

In questo caso, il costo di una classe serializzabile, ma non effettivamente utilizzato per la serializzazione, potrebbe causare errori o confusione di gran lunga superiore al costo della prestazione. per esempio. Diciamo che ci vuole 1 minuto o il tempo di qualcuno per determinare che Serializable non è necessario, questo può costare molto di più del tempo di avvio extra di pochi secondi che l'applicazione comporta.

Se è effettivamente necessario Serializable, non è possibile confrontarlo con la versione non Serializable perché solo il primo caso eseguirà effettivamente il lavoro richiesto.