Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

Hasonló dokumentumok
Abstract osztályok és interface-ek. 7-dik gyakorlat

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

Osztályszintű elérés, kivételkezelés, fájlkezelés

Programozási nyelvek Java

Programozási technológia

Enterprise JavaBeans. Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem. Az Enterprise JavaBeans

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Szoftvertechnológia alapjai Java előadások

Enterprise JavaBeans 1.4 platform (EJB 2.0)

A Java nyelv. V. rész Az objektumorientáltság magasabb fokú tulajdonságai: Perszisztencia, CORBA, RMI

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

OOP: Java 8.Gy: Abstract osztályok, interfészek

Segédanyag: Java alkalmazások gyakorlat

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Segédanyag: Java alkalmazások gyakorlat

Concurrency in Swing

7. K: JAVA alapok Konzultáció

Java Remote Method Invocation API

Java Programozás 7. Gy: Java alapok. Adatkezelő 3.rész

RMI. Az alapoktól a részletekig RMI, activation, class loader-ek, serialization

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Áttekintés. Tartalom. Mi is az a Bean?

Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék

Bevezető. Servlet alapgondolatok

Objektumorientált programozás Java-ban

BME MOGI Gépészeti informatika 8.

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Java hálózatkezelés II. szerver-kliens kapcsolat szálkezelés JAVA PROGRAMOZÁS 10. GYAKORLAT

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

JAVA PROGRAMOZÁS 3.ELŐADÁS

OOP: Java 8.Gy: Gyakorlás

Programozási nyelvek és módszerek Java Thread-ek

Párhuzamos és Elosztott Rendszerek II

Kommunikáció. Folyamatok közötti kommunikáció. Minden elosztott rendszer alapja

DCOM Áttekintés. Miskolci Egyetem Általános Informatikai Tanszék. Ficsor Lajos DCOM /1

Osztályok. 4. gyakorlat

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Szoftvertechnolo gia gyakorlat

A Java Persistence API PersistenceAPI / 3

Osztály és objektum fogalma

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

Java programozási nyelv

S ha kettészelik is: balfelöl belőle Valamivel mindig - Valamivel mindiq több marad. (Nyugat )

R I Szer e i r alizáció.

Serialization. RMI működése

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Java RMI Áttekintés. A Java RMI. A Java RMI architektúrája. Ficsor Lajos. Általános Infromatikai Tanszék Miskolci Egyetem 1.

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Programozási nyelvek II.: JAVA

Globális operátor overloading

Komponensek együttműködése web-alkalmazás környezetben. Jónás Richárd Debreceni Egyetem T-Soft Mérnökiroda KFT

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Hello World Servlet. Készítsünk egy szervletet, amellyel összeadhatunk két számot, és meghívásakor üdvözlőszöveget ír a konzolra.

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Java gyakorlat feladatai e s megolda sai ( )

Java és web programozás

Java. Java Message Service. ANTAL Margit. JMS API technológia. ANTAL Margit. Sapientia - EMTE

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Kivételkezelés, naplózás. Exception handling, logging

Generikus Típusok, Kollekciók

Perzisztencia. ANTAL Margit. Sapientia - EMTE. ANTAL Margit Java technológiák 11. előadás Perzisztencia

Objektumorientált programozás C# nyelven

Bevezetés a Python programozási nyelvbe

Objektumorientált programozás C# nyelven

OOP és UML Áttekintés

Származtatási mechanizmus a C++ nyelvben

Programozás II gyakorlat. 6. Polimorfizmus

Objektumorientált programozás C# nyelven

Osztálytervezés és implementációs ajánlások

Programozási nyelvek II.: JAVA

Osztálytervezés és implementációs ajánlások

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Programozási nyelvek Java

Programozási nyelvek Java

Végrehajtási szálak - kiegészítések. Szinkronizálás, érvénytelenített metódusok helyettesítése

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

A WEB programozása - JSP1 dr.gál Tibor őszi félév

Java és web programozás

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Szoftvertechnológia alapjai Java előadások

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Programozás III KIINDULÁS. Különböző sportoló típusok vannak: futó, magasugró, focista, akik teljesítményét más-más módon határozzuk meg.

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Swing. (A javax.swing csomag)

A SZOFTVERTECHNOLÓGIA ALAPJAI

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

Java RMI Áttekintés. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. javarmi / 1

JEE tutorial. Zsíros Levente, 2012

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Magas szintű programozási nyelvek 2 Előadás jegyzet

Programozás I. Második ZH segédlet

Átírás:

Serialization (in Java) Szerializáció

Java Serialization API Standard eljárás az objektumok állapotának adatfolyamba történő kiírására (elmentésére egy bájtszekvenciába), és visszatöltésére Perzisztencia (archiválás későbbi felhasználásra), osztott OO rendszerek (távoli metódushívások) (marshalling szerializáció, a codebase elmentésével) Lehetőségek: alapértelmezett protokoll, vagy annak módosítása, saját protokoll ObjectInputStream, ObjectOutputStream Kiírás fos = new FileOutputStream(filename); out = new ObjectOutputStream(fos); out.writeobject(new MyObject()); out.close(); Beolvasás fis = new FileInputStream(filename); in = new ObjectInputStream(fis); time = (MyObject)in.readObject(); in.close(); Természetesen try-cath blokkon belül (IOException, FileNotFoundException, NotSerializableException (írás) ClassNotFoundException (beolvasás)) //serialization //live object //exact replica

Serializable interface Az objektumoknak implementálniuk kell a Serializable interface-t (vagy az alaposztálytól örökölniük az implementációt) Az Object nem implementálja, tehát nem minden objektum szerializálható (de a legtöbb standard Java osztály alaposztályok, listák, GUI komponensek igen) Nem szerializálható objektumok pl.: thread, socket, stream stb. (de attól, hogy egy osztály tartalmaz pl. egy thread példányt, a többi része még lehet szerializálható transient típusmódosító alkalmazása) import java.io.serializable; import java.util.date; import java.util.calendar; public class PersistentTime implements Serializable { private Date time; public PersistentTime() { time = Calendar.getInstance().getTime(); public Date gettime(){ return time;

Transient Azokat az adattagokat, amelyeket nem lehet szerializálni, vagy nem szeretnénk, hogy részei legyenek az objektum perzisztens állapotának (nem akarjuk elmenteni) transient nek nyilvánítjuk import java.io.serializable; public class PersistentAnimation implements Serializable, Runnable{ transient private Thread animator; private int animationspeed; public PersistentAnimation(int animationspeed) { this.animationspeed = animationspeed; animator = new Thread(this); animator.start(); public void run(){ while(true) { // do animation here

Protokoll testreszabása Példa: az animáció esetében, ha elmentünk, majd beolvasunk egy PersistentAnimation példányt, a konstruktor nem kerül meghívásra (nem történik példányosítás), az objektum nem fog megfelelő módon viselkedni (a szál nem jön létre, nem indíthatjuk el) Ha külön metódusba tennénk a problémás részt, a felhasználónak tudnia kellene erről a metódusról Jobb megoldás a protokoll módosítása, a következő metódusok újradefiniálásával: private void writeobject(objectoutputstream out) throws IOException; private void readobject(objectinputstream in) throws IOException, ClassNotFoundException; Az újradefiniált metódusok első sorai: out.defaultwriteobject(); in.defaultreadobject(); (nem implementáljuk a szerializálás mechanizmust, csak kiterjesztjük azt (hozzáadunk))

Protokoll testreszabása import java.io.serializable; public class PersistentAnimation implements Serializable, Runnable{ transient private Thread animator; private int animationspeed; public PersistentAnimation(int animationspeed){ this.animationspeed = animationspeed; startanimation(); public void run(){ while(true){ // do animation here private void writeobject(objectoutputstream out) throws IOException{ out.defaultwriteobject(); private void readobject(objectinputstream in) throws IOException, ClassNotFoundException { in.defaultreadobject(); startanimation(); private void startanimation() { animator = new Thread(this); animator.start();

Letiltás Amennyiben nem szeretnénk, hogy az osztályunk példányai szerializálhatóak legyenek (bár az alaposztály implementálja az interfészt, és mi nem unimplementálhatjuk ): private void writeobject(objectoutputstream out) throws IOException { throw new NotSerializableException("Not today!"); private void readobject(objectinputstream in) throws IOException { throw new NotSerializableException("Not today!");

Egyéni protokoll Az Externalizable interface implementálása public void writeexternal(objectoutput out) throws IOException; public void readexternal(objectinput in) throws IOException, ClassNotFoundException; Semmi nincs implementálva, a megvalósítás teljes egészében a mi feladatunk A metódusok a writeobject és readobject metódushívások esetén automatikusan meghívásra kerülnek (hasonlóan az előző példákhoz) Példa: speciális fájlformátumoknak (pl. pdf) megfelelő Java objektumok szerializálása

Version controll Lementjük egy objektum állapotát, módosítjuk az osztályt, majd vissza akarjuk tölteni az elmentett objektumot InvalidClassException (mindenik szerializálható osztályhoz egy egyedi azonosító rendelődik hozzá, ha ez nem talál, kivételt kapunk) Ha például csak egy adattagot adtunk hozza szeretnénk, hogy ez ne így történjék, az illető adattag legyen inicializálva az alapértelmezett értékkel és történhessen meg a betöltés Megoldás: az azonosító a serialversionuid mezőben van tárolva ennek értékét beállíthatjuk manuálisan (a JDK biztosít nekünk ehhez egy serialver nevű eszközt, ami az azonosítót automatikusan generálja, alapértelmezetten az objektum hash kódja alapján) Kompatibilis változtatások: pl. attribútum/metódus törlése/hozzáadása Inkompatibilis változtatások: pl. hierarchia megváltoztatása, interfész implementálásának eltávolítása (pl. Serializable) A különböző (típusú) változtatások listája megtalálható a a Java Serialization Specification -ben

Objektum caching Az ObjectOutputStream alapértelmezetten fent tart egy a beléje írt objektumra mutató referenciát ha kiírjuk az objektumot, majd megváltoztatjuk és újra kiírjuk, az új állapot nem lesz lementve Példa: ObjectOutputStream out = new ObjectOutputStream(...); MyObject obj = new MyObject(); // must be Serializable obj.setstate(100); out.writeobject(obj); // saves object with state = 100 obj.setstate(200); out.writeobject(obj); // does not save new object state Megoldás(ok): Mindig zárjuk a streamet írás után, vagy Használjuk az ObjectOutputStream.reset() metódust (vigyázat: a metódus az összes tárolt referenciát felszabadítja, törli a cache-t)