Serializace
Z MiS
(Rozdíly mezi verzemi)
(Osamostatněno z Práce se soubory) |
m (→Jak serializace funguje?: Upraven formát aby bylo čitelnější) |
||
Řádka 8: | Řádka 8: | ||
== Jak serializace funguje? == | == Jak serializace funguje? == | ||
− | * Třída, jejíž instance chceme ukládat do souboru, musí implementovat rozhraní <code>Serializable</code>. | + | * <code>Serializable</code> |
− | * Pro převod instance na posloupnost byte při zápisu použijeme třídu <code>ObjectOutputStream</code> pro zpětný převod při čtení třídu <code>ObjectInputStream</code>. | + | ** Třída, jejíž instance chceme ukládat do souboru, musí implementovat rozhraní <code>Serializable</code>. |
+ | * <code>ObjectInputStream</code>, <code>ObjectOutputStream</code> | ||
+ | * Pro převod instance na posloupnost byte při zápisu použijeme třídu <code>ObjectOutputStream</code>, | ||
+ | * pro zpětný převod při čtení třídu <code>ObjectInputStream</code>. | ||
== Zápis a načtení objektu == | == Zápis a načtení objektu == |
Aktuální verze z 19. 5. 2014, 08:33
Obsah[skrýt] |
Co je to serializace?
- V objektovém programování pracujeme s objekty, které obsahují atributy.
- Data souboru na disku jsou tvořena posloupností byte. Je na aplikaci, aby věděla, co tyto byte znamenají. Objekty do souborů ukládat přímo nelze.
- Pokud do souboru chceme ukládat složitější data (objekty), musí je naše aplikace převést na posloupnost byte.
- Převod můžeme provést vlastními prostředky, ale musíme si pro to naprogramovat patřičné metody.
- Výhodnější je nechat převod na Javě. Můžeme k tomu využít tzv. serializaci, tedy automatický převod objektů na posloupnosti byte.
Jak serializace funguje?
-
Serializable
- Třída, jejíž instance chceme ukládat do souboru, musí implementovat rozhraní
Serializable
.
- Třída, jejíž instance chceme ukládat do souboru, musí implementovat rozhraní
-
ObjectInputStream
,ObjectOutputStream
- Pro převod instance na posloupnost byte při zápisu použijeme třídu
ObjectOutputStream
, - pro zpětný převod při čtení třídu
ObjectInputStream
.
Zápis a načtení objektu
Následující kód je zjednodušený, neřeší ošetření vyjímek. Jde nám o schéma použití serializace.
Zápis instance třídy Poznamka do souboru na cestě cestaANazevSouboru:
Poznamka pozn = new Poznamka();
File file = new File("cestaANazevSouboru");
// Označuje soubor (uchovává cestu)
FileOutputStream fos = new FileOutputStream(file);
// Otevře soubor pro zápis
ObjectOutputStream objOut = new ObjectOutputStream(fos);
// Provádí převod objektů na posloupnost byte (serializaci)
objOut.writeObject(pozn); //Zápis samotný
objOut.close(); //Uzavření souboru
fos.close(); //Uzavření souboru
Přečtení instance třídy Poznamka ze souboru na cestě cestaANazevSouboru:
Poznamka pozn;
File file = new File("cestaANazevSouboru");
FileInputStream fis = new FileInputStream(file);
ObjectInputStream objIn = new ObjectInputStream(fis);
pozn = (Poznamka) objIn.readObject();
// lépe by bylo ověřit správnou třídu pomocí instance_of
objIn.close();
fis.close(); //Uzavření souboru
Příklad: poznámkový blok
- Máme třídu
Poznamka
, která obsahuje text poznámky a datum vytvoření. - Máme 30 poznámek (instancí třídy) a chceme je uložit do souboru a později načíst.
- Můžeme tedy:
- zapsat data do textového souboru, kam na každý řádek zapíšeme jednu poznámku v textové podobě, pak středník a pak datum vytvoření ve formátu DD.MM.YYYY
- pro ukládání a čtení si ale musíme připravit metody, které vyřeší třeba situaci, kdy je středník součástí poznámky samotné.
- Pro tento případ viz: Java: Textový vstup a výstup
- použít serializaci. Pak stačí, když třída
Poznamka
implementuje rozhraníSerializable
, protožeString
iDate
toto rozhraní také implementují a jiné atributy třídaPoznamka
nemá.
- zapsat data do textového souboru, kam na každý řádek zapíšeme jednu poznámku v textové podobě, pak středník a pak datum vytvoření ve formátu DD.MM.YYYY