2011-11-05 11 views
11

Sebbene l'interfaccia java.io.Serializable public interface Serializable{} sorprendentemente non contenga metodi e campi in Java, la classe che implementa questa interfaccia è in grado di ottenere la funzione di serializzazione e deserializzazione (lo stato dell'oggetto serializzato o deserializzato) . Come può ottenere la funzione di serializzazione e deserializzazione senza alcun metodo o campo in Java?Sebbene l'interfaccia Serializable in Java non abbia metodi, nessun campo, può raggiungere la sua funzione. Come?

risposta

11

Alcune interfacce servono solo come "indicatori" o "contrassegni".

L'UID e lettori/scrittori personalizzati sono accessibili tramite riflessione.

Serializable è un indicatore e JRE/JVM può intervenire in base alla sua presenza.

http://en.wikipedia.org/wiki/Marker_interface_pattern

1

L'interfaccia Serializable è un'interfaccia marcatore che notifica solo JVM che un certo oggetto è impostato per essere serializzati. Il processo di serializzazione avviene internamente.

2

Serializable non contiene alcun metodo, è il ObjectOutputStream e ObjectInputStream classi che possono fare quel lavoro, attraverso i metodi writeObject e readObject.

Serializable è solo un'interfaccia marcatore, in altre parole si limita a mettere un flag, senza richiedere campi o metodi.

1

Un design migliore sarebbe stata

interface Serializable 

    void writeObject(ObjectOutputStream out) 

    void readObject(ObjectInputStream in) 

Il problema è che non v'è alcun modo per fornire implementazioni predefinite; quindi ogni sottoclasse deve implementare questi due metodi, che è una seccatura.

class MyClass implements Serializable 

    // stupid boilerplate code 
    void writeObject(ObjectOutputStream out) 
    { 
     Util.defaultWriteObject(this, out); 
    } 

In Java 8, questo sta per cambiare, possiamo avere impls di default per i metodi di interfaccia

interface Serializable 

    void writeObject(ObjectOutputStream out) default Util::defaultWriteObject 

    void readObject(ObjectInputStream in) default Util::defaultReadObject 

(Serializable non verrà modificato, ma la nuova funzionalità può essere utilizzata in casi analoghi)

+0

si può implemnt java.io.Externalizable di avere il controllo sulla serializzazione e deserializzazione –

0

Concordo con irreputable, soprattutto l'affermazione implicita che ogni oggetto deve sapere come serializzare/deserializzare stesso, tranne il suo/la sua affermazione che:

non v'è alcun modo per fornire di default implementationsckquote

Certo c'è: Object Composition.

0

La serializzazione è un modo per salvare oggetti e usiamo un'interfaccia Serializable per raggiungere il nostro obiettivo. L'interfaccia serializzabile è un'interfaccia marker. Il modello di interfaccia del marcatore è un modello di progettazione e fornisce informazioni sul tempo di esecuzione degli oggetti.

+0

Non è che quello che tutti detto sei anni fa? –

0

Se si vede l'implementazione del metodo writeObject di ObjectOutputStream, lo snippet di codice che segue verrà visualizzato all'interno dell'implementazione.

Qui si può vedere, se la classe non attua interfaccia Serializable, quindi NotSerializableException viene generata.

if (obj instanceof String) { 
    writeString((String) obj, unshared); 
} else if (cl.isArray()) { 
    writeArray(obj, desc, unshared); 
} else if (obj instanceof Enum) { 
    writeEnum((Enum<?>) obj, desc, unshared); 
} else if (obj instanceof Serializable) { 
    writeOrdinaryObject(obj, desc, unshared); 
} else { 
    if (extendedDebugInfo) { 
     throw new NotSerializableException(
      cl.getName() + "\n" + debugInfoStack.toString()); 
    } else { 
     throw new NotSerializableException(cl.getName()); 
    } 
} 

Serializable è solo un'interfaccia marcatore. Java lo utilizza internamente a per verificare che l'oggetto sia effettivamente scrivibile o meno.

Problemi correlati