Quando dovremmo implementare l'interfaccia serializzabile?


153
public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. Quando dovrei implementare Serializable interfaccia?
  2. Perché lo facciamo?
  3. Dà qualche vantaggio o sicurezza?

1
Cordiali saluti, la risposta accettata qui è incompleta e fuorviante, perché non affronta gli svantaggi della sicurezza. Vedi Effective Java , item 86: Implementare serializzabile con grande cautela. La risposta di Raedwald qui dicendo di non usare la serializzazione è quella corretta.
Nathan Hughes,

Risposte:


157
  1. Da cosa tratta questa cosa della "serializzazione"? :

    Ti consente di prendere un oggetto o un gruppo di oggetti, metterli su un disco o inviarli tramite un filo o un meccanismo di trasporto wireless, quindi in seguito, forse su un altro computer, invertire il processo: resuscitare gli oggetti originali. I meccanismi di base sono di appiattire gli oggetti in un flusso unidimensionale di bit e di riportare quel flusso di bit negli oggetti originali.

    Come il Transporter su Star Trek, si tratta di prendere qualcosa di complicato e trasformarlo in una sequenza piatta di 1 e 0, quindi prendere quella sequenza di 1 e 0 (forse in un altro posto, forse in un altro momento) e ricostruire l'originale complicato " qualcosa."

    Quindi, implementare l' Serializableinterfaccia quando è necessario archiviare una copia dell'oggetto, inviarli a un altro processo che viene eseguito sullo stesso sistema o sulla rete.

  2. Perché vuoi archiviare o inviare un oggetto.

  3. Rende facile la memorizzazione e l'invio di oggetti. Non ha nulla a che fare con la sicurezza.


4
È una buona pratica implementare l'interfaccia seriablizble a tutti i modelli di dominio ...
theJava

8
@theJava Non è una questione di buone pratiche. Si tratta di stabilire se è necessario o meno una serie di byte.
Moinudin,

5
Quando usi JSON non devi implementare questa interfaccia e puoi semplicemente inviare quella stringa .. quindi non sono ancora sicuro del perché usare questa interfaccia quando puoi usare JSON.
Yonatan Nir,

1
@YonatanNir Non sono sicuro del motivo per cui uno dovrebbe usare JSON quando MsgPack, Avro, Thrift o Protobuf sono migliori per il trasferimento di IO.
OneCricketeer il

1
@YonatanNir Uno schema rigorosamente definito è migliore. E JSON è pensato per essere leggibile dall'uomo, mentre i formati codificati binari sono molto più efficienti via cavo
OneCricketeer

48
  1. Implementa l' Serializableinterfaccia quando vuoi essere in grado di convertire un'istanza di una classe in una serie di byte o quando pensi che un Serializableoggetto possa fare riferimento a un'istanza della tua classe.

  2. Serializable le classi sono utili quando si desidera mantenere le loro istanze o inviarle su un filo.

  3. Le istanze di Serializableclassi possono essere facilmente trasmesse. Tuttavia, la serializzazione ha alcune conseguenze sulla sicurezza. Leggi l' effettivo Java di Joshua Bloch .


32

La risposta a questa domanda è, forse sorprendentemente, mai , o più realisticamente, solo quando sei costretto a interoperabilità con il codice legacy . Questa è la raccomandazione in Effective Java, 3rd Edition di Joshua Bloch:

Non vi è alcun motivo per utilizzare la serializzazione Java in qualsiasi nuovo sistema che si scrive

Il principale architetto di Oracle, Mark Reinhold, afferma che la rimozione dell'attuale meccanismo di serializzazione Java è un obiettivo a lungo termine.


Perché la serializzazione Java è difettosa

Java fornisce come parte del linguaggio uno schema di serializzazione a cui è possibile aderire, utilizzando l' Serializableinterfaccia. Questo schema ha tuttavia diversi difetti irrisolvibili e dovrebbe essere trattato come un esperimento fallito dai progettisti del linguaggio Java.

  • Si finge fondamentalmente che si possa parlare della forma serializzata di un oggetto. Ma ci sono infiniti schemi di serializzazione, che si traducono in infinitamente molte forme serializzate. Imponendo uno schema, senza alcun modo di modificare lo schema, le applicazioni non possono utilizzare uno schema più appropriato per loro.
  • È implementato come mezzo aggiuntivo per la costruzione di oggetti, che elude qualsiasi controllo preliminare eseguito dai costruttori o dai metodi di fabbrica. A meno che non venga scritto un codice di deserializzazione complicato, soggetto a errori e difficile da testare, probabilmente il tuo codice presenta una debolezza di sicurezza.
  • È molto difficile testare l'interoperabilità di diverse versioni del modulo serializzato.
  • La manipolazione di oggetti immutabili è problematica.

Cosa fare invece

Utilizzare invece uno schema di serializzazione che è possibile controllare esplicitamente. Come Buffer di protocollo, JSON, XML o il tuo schema personalizzato.


2
non molto esperto a quel livello, ma senti di avere un punto.
nightfury,

1
Penso che sia la risposta migliore!
jjanczur,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.