2015-07-14 15 views
9

so che cosa è la serializzazione e il motivo per cui viene utilizzato, ma la mia domanda:Perché l'interfaccia serializzabile non contiene metodi?

  1. Perché serializzazione un'interfaccia marcatore?
  2. Qual è il potenziale vantaggio di non avere writeObject, readObject nell'interfaccia Serializable perché quando eseguiamo la serializzazione, alla fine sostituiremo questi 2 metodi?
  3. In che modo readResolve assicura che l'oggetto creato durante la deserializzazione non sia il nuovo oggetto. Conosco il sotto e restituisce lo stesso oggetto durante la deserializzazione ma chi chiamerà questo metodo readResolve internamente?

    private Object readResolve() throws java.io.ObjectStreamException { 
        return INSTANCE; 
    } 
    
+3

* perché quando eseguiamo la serializzazione, finalmente annulliamo questi 2 metodi? *: No, non lo fai. * Chi chiamerà internamente questo metodo readResolve? *: ObjectInputStream (o una delle classi che utilizza), che viene utilizzato per deserializzare gli oggetti. –

+0

Le interfacce non possono specificare metodi privati, per una cosa. – immibis

+0

@ gronostaj: Credo che il link non risponda a tutte le mie domande. – Lathy

risposta

10
  1. Perché ci deve essere qualche modo esplicito di dichiarare una classe di essere serializzabile. Il framework non può semplicemente assumere che tutte le classi siano serializzabili, poiché ci sono molti tipi di oggetti che smetteranno di funzionare se i loro campi sono scritti su disco e successivamente ricaricati (ad esempio FileInputStream, che si basa su un handle di file del sistema operativo aperto che potrebbe non esistere più quando l'oggetto è deserializzato). Il modo moderno di avere una tale dichiarazione sarebbe un'annotazione, ma quelli non esistevano in Java al momento dell'aggiunta della serializzazione.
  2. Non sarà necessario sovrascriverli, se il comportamento predefinito del serializzatore è sufficiente; non è necessario fare nulla se non implementare Serializable.
  3. The serialization framework calls it when an object has been completely deserialized. A questo punto, l'oggetto può ispezionare il proprio contenuto e, se decide che dovrebbe essere rappresentato da un'altra istanza, può invece restituire tale istanza (in caso contrario restituisce this). Qualunque cosa esca da questo metodo viene restituita al codice che ha richiesto la deserializzazione. Se è stato restituito un oggetto preesistente, il nuovo oggetto creato dal deserializzatore non sarà visto da nessuno e alla fine verrà raccolto.
+0

Ciao Aasmund, grazie per i vostri commenti. Puoi spiegare in dettaglio il tuo punto 1? – Lathy

+0

@Lathy: quale parte di esso? –

+0

"Il framework non può semplicemente presupporre che tutte le classi siano serializzabili .." – Lathy

2

Marker Le interfacce vengono utilizzate per indicare a JVM di eseguire attività specifiche. non hanno alcun metodo. Serializable è anche un'interfaccia marker.

La serializzazione è il processo di appiattimento degli oggetti. quando si implementa l'interfaccia serializzabile in una classe, indica a JVM di serializzare il proprio oggetto, cioè deve essere convertito in stream.

Problemi correlati