Moduł 03
Transkrypt
Moduł 03
Metody dostępu do danych dr inż. Grzegorz Michalski Na podstawie wykładów dra inż. Juliusza Mikody Serializacja Klasy serializowane to klasy implementujące interfejs java.io.Serializable. Interfejs Serializable to jedynie wskazanie że klasa może być szeregowana. Zapis następuje dla pól publicznych, chronionych oraz pakietowych. Podczas deserializacji, pola nie serializowane klasy zostaną zainicjowane za pomocą konstruktora domyślnego. Konstruktor domyślny musi być dostępna dla podklasy. Serializacja - przykład class LineItem implements Serializable { private static final long serialVersionUID = 1L; String n; public LineItem(String b) { n = b; } } class Order implements Serializable { private static final long serialVersionUID = 1L; int i; ArrayList<LineItem> tab; public Order(int i) { tab = new ArrayList<LineItem>(); } public void addItem(LineItem l) { tab.add(l); } } Serializacja zapis / odczyt Order o = new Order(111); o.addItem(new LineItem("line 1")); o.addItem(new LineItem("line 2")); ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream out; out = new ObjectOutputStream(bo); out.writeObject(o); out.close(); ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream in = new ObjectInputStream(bi); Order io = (Order) in.readObject(); in.close(); Własny mechanizm serializacji Do zapisu stanu obiektu służy metoda: private void writeObject(java.io.ObjectOutputStream out) throws IOException Do odczytu stanu obiektu służy metoda: private void readObject(java.io.ObjectInputStream in)throws IOException, ClassNotFoundException; Serializacja Przechowywanie prostych typów danych Możliwość dziedziczenia obiektów Binnary - bardzo prosty sposób zapisu obiektu w strumień. XML - serializacja w pełni zgodna ze standardami języka XML. Kiedy unikać serializacji Możliwość formułowania zapytań – ze strumienia nie można odczytać filtrowanych danych lecz wszystkie zapisane obiekty. Częściowy odczyt, aktualizacja danych Zarządzanie cyklem życia obiektów Współbieżność Transakcje Java Data Objects Java Data Objects (JDO) jest standardem interfejsu programistycznego (ang. API) dla technologii trwałości danych. Główne idee, jakie stara się realizować to pełna niezależność od rodzaju źródła danych oraz przeźroczystość. JDO jest jednak tylko standardem definiującym interfejs programistyczny. Aby mieć z niego jakikolwiek rzeczywisty pożytek niezbędna jest jeszcze implementacja. JDO Historia JDO 1.0 : FOStore JDO 2.0 : JPOX 1.1 (2006) JDO 2.1 : JPOX 1.2 (2008) JDO 2.2 : DataNucleus AccessPlatform 1.0.1 (2008) JDO 3.0 : DataNucleus AccessPlatform 2.1.0 (2010) JDO 3.1 : DataNucleus AccessPlatform 3.0.0 (2011) Zalety JDO Łatwość użytkowania: programiści aplikacji mogą skupić się na modelu obiektu i pozostawić szczegóły dotyczące zapisu do realizacji JDO. Przenośność: Aplikacja napisana z JDO może być uruchamiana na wielu platformach bez rekompilacji lub zmiany kodu źródłowego. Niezależność od bazy danych: Aplikacje napisane z JDO są niezależne od bazy danych. Implementacje JDO wspierają wiele różnych rodzajów źródeł danych, w tym relacyjnych i obiektowych baz danych, XML, plików płaskich i inne. Trwałość Byt programistyczny jest trwały, jeżeli żyje dłużej niż trwa czas działania programu, który go używa (przenosi się pomiędzy kolejnymi uruchomieniami programu). Wszystko, co zawierają bazy danych, jest trwałe. Trwałą zmienną jest zmienna programistyczna, która ma wszystkie własności normalnej zmiennej, ale której wartość przy nowym uruchomieniu programu jest taka sama, jak przy zakończeniu poprzedniego uruchomienia programu. Prototypowe języki z trwałością (DBPL, Napier88, PS-Algol, Galileo, Fibonacci, Loqis,... ) Rodzaje trwałości Trwałość poprzez osiągalność: Obiekt trwały nie może mieć nietrwałych pod-obiektów lub atrybutów, ani też nie może zawierać wskaźnika prowadzącego do obiektu nietrwałego. Trwałość poprzez dziedziczenie: specjalne klasy z cechą trwałości, wszystkie klasy potomne są klasami z trwałością. Trwałość poprzez utworzenie: podczas tworzenia programista ustala, czy tworzony obiekt ma być trwały. Java obiekty trwałe Obiekt: Order o = new Order(111); Jest obiektem ulotnym. Aby uzyskać obiekt trwały: PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); tx.begin(); Order o = new Order(111); pm.makePersistent(o); tx.commit(); Trwałość przechodnia PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); tx.begin(); Order o = new Order(111); pm.makePersistent(o); o.addItem(new LineItem("line")); // Obiekty trwa e tx.commit(); o.addItem(new LineItem("next line")); // Obiekt jest ju ulotny Trwałość oferowana przez JDO Jest ortogonalna – wszystkie obiekty klas definiowanych przez użytkownika mogą być utrwalone. Wyjątek stanowią klasy, których stan zależy od systemu (File, Socket, Thread itp). Stanu systemu nie da się odtworzyć. Jest przeźroczysta dla klientów. Kod aplikacji nie musi umieszczać obiektów w pamięci trwałej ani ich odzyskiwać. Dotyczy poszczególnych obiektów. Obiekty mogą być trwałe lub ulotne. Nie zmienia typu obiektu i zachowuje kontrolę ich zgodności. Specyfikacja JDO Zdefiniowanie standardu umożliwiającego tworzenie obiektów trwałych. Zdefiniowanie standardowego interfejsu programistycznego (API) używanego przez programistę Zdefiniowanie interfejsu programistycznego Service Provider Interface (SPI). Interfejs ten jest implementowany przez dostawcę JDO. Dostarczenie wzorcowej implementacji standardu JDO.