Úvod

Serializace je konverze z stavu objektu do proudu bajtů; deserializace dělá opak. Jinak řečeno, serializace je konverze objektu Java do statického proudu (sekvence) bajtů, které pak mohou být uloženy do databáze nebo přeneseny přes síť.

serializace a Deserializace

proces serializace je nezávislý na instanci, tj., objekty mohou být serializovány na jedné platformě a deserializovány na druhé. Třídy, které jsou způsobilé pro serializaci, musí implementovat speciální značkovací rozhraní Serializovatelné.

Oba ObjectInputStream a ObjectOutputStream jsou na vysoké úrovni tříd, které rozšiřují java.io.InputStream a java.io.OutputStream, resp. ObjectOutputStream může psát primitivní typy a grafy objektů do výstupního proudu jako proud bajtů. Tyto proudy lze následně číst pomocí ObjectInputStream.,

nejdůležitější metodou v ObjectOutputStream je:

public final void writeObject(Object o) throws IOException;

který vezme serializovatelný objekt a převede jej na sekvenci (proud) bajtů. Podobně, nejdůležitější metoda v ObjectInputStream je:

public final Object readObject() throws IOException, ClassNotFoundException;

, Což můžete přečíst proud bajtů a převést zpět do Java objektu. To pak může být odlit zpět do původního objektu.

pojďme ilustrovat serializaci s třídou osob. Všimněte si, že statická pole patří do třídy (na rozdíl od objektu) a nejsou serializována., Také, na vědomí, že můžeme použít klíčové slovo přechodné ignorovat třídy pole během serializace:

public class Person implements Serializable { private static final long serialVersionUID = 1L; static String country = "ITALY"; private int age; private String name; transient int height; // getters and setters}

test níže ukazuje příklad uložení objektu typu Osoba na místní soubor, pak si přečtěte tuto hodnotu zpět na:

použili Jsme ObjectOutputStream pro uložení stavu objektu do souboru pomocí FileOutputStream. Soubor “ yourfile.txt “ je vytvořen v adresáři projektu. Tento soubor je pak načten pomocí FileInputStream. ObjectInputStream vybere tento proud nahoru a převede jej do nového objektu s názvem p2.,

nakonec testujeme stav načteného objektu a odpovídá stavu původního objektu.

Všimněte si, že načtený objekt musí být explicitně obsazen do typu osoby.

Java serializace upozornění

existují některé námitky, které se týkají serializace v Javě.

3.1. Dědičnost a složení

když třída implementuje rozhraní java.io.Serializable, všechny jeho dílčí třídy jsou také serializovatelné., Naopak, když objekt má odkaz na jiný objekt, tyto objekty musí implementovat rozhraní Serializable samostatně, nebo jinde NotSerializableException bude vyvolána:

public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}

Pokud jedno z polí v serializovatelný objekt se skládá z pole objektů, pak všechny tyto objekty musí být serializable stejně, nebo jinak NotSerializableException bude hozen.

3.2. Sériová verze uid

JVM spojuje číslo verze (dlouhé) s každou serializovatelnou třídou., Používá se k ověření, že uložené a načtené objekty mají stejné atributy, a proto jsou kompatibilní se serializací.

toto číslo může být generováno automaticky většinou IDEs a je založeno na názvu třídy, jeho atributech a přidružených modifikátorech přístupu. Jakékoli změny mají za následek jiné číslo a mohou způsobit InvalidClassException.

Pokud serializovatelná třída nevyhlásí serialVersionUID, JVM ji vygeneruje automaticky za běhu., Nicméně, to je vysoce doporučeno, aby každá třída deklaruje jeho serialVersionUID jako generovaný jeden je kompilátor závislý, a tak může mít za následek neočekávané InvalidClassExceptions.

3.3. Vlastní serializace v Javě

Java určuje výchozí způsob, jakým mohou být objekty serializovány. Třídy Java mohou toto výchozí chování přepsat. Vlastní serializace může být zvláště užitečná při pokusu o serializaci objektu, který má některé neserializovatelné atributy., To může být provedeno tím, že poskytuje dvě metody uvnitř třídy, které chceme serializovat:

private void writeObject(ObjectOutputStream out) throws IOException;

a

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

Pomocí těchto metod, můžeme serializovat ty unserializable atributy do jiné formy, které lze serializovat:

public class Address { private int houseNumber; // setters and getters}

následující test jednotky testy vlastní serializaci:

V tomto kódu, vidíme, jak ušetřit nějaké unserializable atributy serializace Adresu s vlastní serializaci. Všimněte si, že musíme označit unserializable atributy jako přechodné, aby se zabránilo NotSerializableException.,

Závěr

V tento rychlý návod, prošli jsme si Java serializace, probírali důležité věci mít na paměti, a ukázaly, jak to udělat vlastní serializaci.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *