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
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.
L'interfaccia Serializable è un'interfaccia marcatore che notifica solo JVM che un certo oggetto è impostato per essere serializzati. Il processo di serializzazione avviene internamente.
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.
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)
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.
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.
Non è che quello che tutti detto sei anni fa? –
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.
- 1. gridview vuoto sebbene la sqldatasource abbia valori
- 2. generici Java e Serializable
- 3. Microsoft Edge non può raggiungere la VM con IP privato
- 4. java.util.concurrent.RejectedExecutionException in Spark sebbene driver/client abbia esattamente la stessa versione del server
- 5. Raggiungere il multi-core in Java: come?
- 6. Come copia completa una classe senza la marcatura come Serializable
- 7. Scala Funzione RiduciBy - utilizza qualsiasi tipo che abbia + metodo
- 8. Penalità per implementare Serializable in Java?
- 9. raggiungere la funzione di ng-repeat angolare in javascript
- 10. lunghezza punto in java - trova la sua definizione
- 11. Raggiungere la ricorsione senza stack in Java 8
- 12. Metodi non virtuali in Java
- 13. non è stato possibile raggiungere la piena precisione in 'qbeta'
- 14. Qualcuno può spiegare la dichiarazione di questi metodi generici java?
- 15. Java serializzazione, writeObject (Object obj) perché non writeObject (obj Serializable)
- 16. Primavera 4 non può eseguire Java 8 metodi predefiniti
- 17. Come raggiungere la fine di un'espressione AST
- 18. C - Confuso da 'controllo può raggiungere la fine della funzione non vuota' quando si utilizza la sintassi se/else
- 19. Perché la tabella hash di HashMap è contrassegnata come transitoria sebbene la classe sia serializzabile
- 20. Elixir/Erlang può copiare un processo, compresa la sua memoria?
- 21. Java dichiarazione campo generico
- 22. Metodi di serializzazione Java
- 23. Java Serializable Object to Byte Array
- 24. Tomcat funziona, ma non può raggiungere http: // localhost: 8080/
- 25. L'istanza di ubuntu di AWS non può raggiungere il mondo
- 26. non può esportare la funzione freccia const
- 27. VBA può raggiungere le istanze di Excel?
- 28. j8583 non può gestire il campo 128
- 29. Come sovraccaricare la funzione Scala applicare metodi
- 30. Effective Java No. 74 (sulla serializzazione): Implementare Serializable giudiziosamente
si può implemnt java.io.Externalizable di avere il controllo sulla serializzazione e deserializzazione –