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 | 
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 
Poznamkaimplementuje rozhraníSerializable, protožeStringiDatetoto rozhraní také implementují a jiné atributy třídaPoznamkanemá. 
 -  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