JavaRush /Java Blog /Random-IT /Interfacce - marcatori
dupliaka
Livello 29
Санкт-Петербург

Interfacce - marcatori

Pubblicato nel gruppo Random-IT
Le interfacce marcatore sono un modello di progettazione con controllo del tipo in fase di esecuzione che consente di associare un'interfaccia e una classe. Per capire perché ciò potrebbe essere necessario, si consideri l'esempio di come contrassegnare la classe Serializible con un marcatore. Supponiamo di dover salvare lo stato di un oggetto in memoria e quindi anche di poter decrittografare ciò che abbiamo salvato. Quindi, dici, possiamo convertire il nostro oggetto in un insieme di bit. Giusto. Possiamo usare un modo semplice per scrivere su un file usando FileInputStream, ma questo è conveniente solo se ci sono pochi oggetti, ma cosa succede se ce ne sono molti? C'è un meraviglioso strumento di serializzazione per questo. La regola principale quando lo si utilizza è che l'oggetto da serializzare deve contenere tutti i dati e non fare riferimento ad altri oggetti. Guarda la tua classe "Aha, i campi non hanno riferimenti ed è bello mettere il marcatore Serializzabile." E quando lo inserirai, significherà che gli oggetti che hai contrassegnato possono essere scritti su ObjectOutputStream. La classe ObjectOutputStream ha un metodo writeObject0() e contiene istanze di controlli che controllano se l'oggetto può essere scritto e se l'intera serie di controlli fallisce, viene generata un'eccezione NotSerializableException e, in caso contrario, tutto viene scritto correttamente in memoria. Creiamo una classe BigObject, di cui serializzeremo le istanze. package post1; import java.io.Serializable; public class BigObject implements Serializable { private int id; public void setId(final int id){ this.id = id; } public int getId() { return id; } } La classe BigObject è già contrassegnata come Serializable. Ha un campo ID e metodi get/set associati. package post1; import post1.BigObject; import java.io.*; public class InterfaceMarker { public static void main(String[] args) throws IOException, ClassNotFoundException { int originalId = 12; BigObject objectOriginal = new BigObject(); objectOriginal.setId(originalId); ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream(); ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer); outputStream.writeObject(objectOriginal); outputStream.close(); byte[] buffer = writeBuffer.toByteArray(); ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer); ObjectInputStream inputStream = new ObjectInputStream(readBuffer); BigObject objectCopy = (BigObject)inputStream.readObject(); if (objectCopy.getId() == originalId) System.out.println( "originalId equals copiedId"); } }

Registrare un oggetto

Per prima cosa creiamo un oggetto della classe serializzabile BigObject, quindi prepariamo un buffer di dati per esso, il luogo in cui inseriremo tutti gli archi ByteArrayOutputStream. Quindi prepariamo il già citato ObjectOutputStream e gli passiamo il buffer, scriviamo il nostro oggetto nello stream e lo chiudiamo.

Leggere un oggetto

Prepariamo un buffer di scrittura readBuffer, passiamo inputStream, leggiamo readObject(). L'oggetto è stato ora restaurato. Grazie al fatto che il campo `id` non era un collegamento, abbiamo potuto contrassegnare la classe Serializable, che ne contiene completamente i dati. Invece di aggiungere funzioni di validazione all'interno della nostra classe, i token ci permettono di semplificare il processo di validazione della classe.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION