Serializacja Serializacja pozwala zamienić obiekt na sekwencję bajtów, w sposób umożliwiający później wierne odtworzenie jego zawartości Inna nazwa to.

Slides:



Advertisements
Podobne prezentacje
Wstęp do strumieni danych
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 4 ( ) Przeciążanie operatorów.
Programowanie obiektowe
Wzorce.
PROGRAMOWANIE STRUKTURALNE
WEB SERVICE Stefan Rutkowski.
CORBA Łukasz Wnęk.
Autor Roman Jędras Prowadzący: dr inż. Antoni Izworski Przedmiot:
Programowanie obiektowe w Javie
RMI I RMI-IIOP Wprowadzenie Co to jest RMI?
Inżynieria oprogramowania Lecture XXX JavaTM – część IV: IO
Systemy operacyjne Wykład nr 5: Wątki Piotr Bilski.
Wykład 2. Wprowadzenie do architektur systemów rozproszonych
C++ wykład 2 ( ) Klasy i obiekty.
Gniazda komunikacji sieciowej w języku Java
Enteprise Java Beans Emil Wcisło.
Wzorce projektowe w J2EE
Czytanie, pisanie i rysowanie – cd.. Jeszcze jeden strumyk PrintStream działa jak PrintWriter, ale: Używa domyślnego (systemowego) kodowania Nie wyrzuca.

Zarządzanie stanem aplikacji Mechanizm Sesji
Obsługa systemu wejścia-wyjścia
Język Java Wielowątkowość.
Modele baz danych - spojrzenie na poziom fizyczny
Spring podstawy.
Projektowanie warstwy serwera Wprowadzenie. Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu.
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
Tworzenie nowych kont lokalnych i domenowych, oraz zarządzanie nimi
W większości języków programowania biblioteki wejścia/wyjścia ukrywają szczegóły obsługi poszczególnych mediów pod abstrakcją strumienia (ang. stream).
Tworzenie aplikacji mobilnych
Automatyka i Robotyka Systemy czasu rzeczywistego Wykład 4.
Obsługa systemu wejścia-wyjścia
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Maciek Mięczakowski
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Tworzenie Aplikacji Internetowych dr Wojciech M. Gańcza 8.
Programowanie obiektowe 2013/2014
1 Strumienie Hierarchie klas strumieniowych, strumienie bajtowe - klasy InputStream i OutputStream i ich metody, klasa File, strumienie plikowe, strumienie.
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
Adam Ptaszek Krystian Formiński
Projektowanie stron WWW
Kurs języka C++ – wykład 4 ( )
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
PROGRAMOWANIE W JAVA Informatyka Stosowana – ROK II / III Laboratoria mgr inż. Krzysztof Bzowski.
Elementy JavaServer Pages. Dyrektywy JSP  Elementy dyrektyw używane są do określania tej informacji o stronie, która pozostaje bez zmiany między żądaniami.
Paweł Starzyk Obiektowe metody projektowania systemów
Waldemar Bartyna 1 Programowanie zaawansowane LINQ to XML.
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Programowanie sieciowe w Javie RMI Wykład 11 mgr inż. Michał Misiak.
Łukasz Bieszczad Mateusz Gałązka Karol Włodarek
Programowanie Zaawansowane
Model warstwowy ISO-OSI
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
Zarządzanie stanem w aplikacjach ASP.NET Elżbieta Mrówka-Matejewska
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
AJAX w PHP.
Programowanie Obiektowe – Wykład 6
Kurs języka C++ – wykład 3 ( )
Wątki, programowanie współbieżne
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
Programowanie Obiektowe – Wykład 2
Programowanie obiektowe – zastosowanie języka Java SE
Aplikacje i usługi internetowe
PGO Interfejsy Michail Mokkas.
JavaBeans by Paweł Wąsala
Modele baz danych - spojrzenie na poziom fizyczny
Zapis prezentacji:

Serializacja Serializacja pozwala zamienić obiekt na sekwencję bajtów, w sposób umożliwiający później wierne odtworzenie jego zawartości Inna nazwa to trwałość (ang. persistence) – cecha oznaczająca, że życie obiektu nie jest ograniczone tylko do czasu działania programu Działa to również w sieci, pomiędzy maszynami działającymi pod różnymi systemami operacyjnymi Dużo klas z bibliotek Javy jest zmodyfikowanych tak, że wspierają serializację (np. kolekcje)

Zastosowania serializacji Trwałość – zapisanie obiektów na dysk oraz odtworzenie przy kolejnym uruchomieniu programu. Zdalne wywoływanie metod między komputerami poprzez RMI (ang. Remote Method Invocation). Pozwala to obiektowi istniejącemu na jednym komputerze zachowywać się tak, jakby istniał na drugim komputerze. Serializacja jest używana do przekazywania argumentów przy wywołaniu metod odległego obiektu oraz do zwracania wartości. Komponenty JavaBeans – elementy z których buduje się interfejs użytkownika. W trakcie projektowania stan komponentu jest serializowany, a przy starcie programu jest on odtwarzany.

Sposoby realizacji Serializację typowo realizuje się przez: Implementację w klasie, która ma być serializowana interfejsu Serializable (nie ma żadnych metod) Można także kontrolować przebieg serializacji przez: Implementację w klasie interfejsu Externalizable oraz jego dwóch metod: writeExternal() – zapis obiektu i readExternal() – odczyt obiektu, musi być też dostępny publiczny konstruktor domyślny Implementację w klasie interfejsu Serializable oraz dodatkowo (!) dwóch prywatnych metod writeObject() i readObject()

Działanie Żeby zserializować obiekt, trzeba utworzyć strumień ObjectOutputStream i wywołać jego metodę writeObject() podając obiekt do serializacji. Może się tu pojawić wyjątek IOException. Żeby odtworzyć obiekt, trzeba utworzyć strumień ObjectInputStream, wywołać jego metodę readObject() i dokonać rzutowania (readObject() zwraca bowiem obiekt klasy Object). Mogą się tu pojawić wyjątki IOException oraz ClassNotFoundException. Słowo kluczowe transient pozwala wskazać, które składowe obiektu mają nie być serializowane.

Przykład serializowania obiektów import java.io.*; class Wezel implements Serializable { String nazwa; /* ... */ } public class Serializacja { Wezel korzen = new Wezel(); /* ... */ void zapiszWezly() throws IOException { } /* ... utworzenie strumienia wyjściowego ... */ ObjectOutputStream out = new ObjectOutputStream( /*strumień wyj.*/ ); out.writeObject(korzen);

Przykład odtwarzania obiektów /* ... */ void przywrocWezly() throws IOException, ClassNotFoundException { } /* ... utworzenie strumienia wejściowego ... */ ObjectInputStream in = new ObjectInputStream( /*strumień wej.*/ ); // odczytanie obiektu i rzutowanie do // odpowiedniego typu korzen = (Wezel) in.readObject();

Serwlety i zasoby Serwlet działający w środowisku serwera J2EE występuje tylko w jednej kopii Jeśli do swojego działania potrzebuje jakichś zasobów, to może tego dokonać przy starcie, w swojej metodzie init() Po skończeniu pracy (przy wyładowywaniu serwletu z pamięci) powinien zwolnić zasoby w swojej metodzie destroy() Należy przy tym uważać, żeby nie zwolnić zasobów, które są jeszcze używane

Inicjalizacja zasobów – init() Jeśli inicjalizacja zasobów potrzebnych do działania nie udała się, serwlet powinien wyrzucić wyjątek UnavailableException public class DBServlet extends HttpServlet { /* ... */ public void init() throws ServletException { establishConnection(); if (connection == null) throw new UnavailableException( "Couldn't get database."); }

Zwalnianie zasobów – destroy() Zasoby można dodatkowo ustawić na null, aby szybciej uległy procesowi odśmiecania pamięci public class DBServlet extends HttpServlet { /* ... */ public void destroy() { connection.close(); connection = null; }

Serwlety i wątki Serwer obsługujący serwlety umożliwia równoczesne wykonanie kodu serwletu dla wielu żądań klientów, tworząc wątek dla każdego żądania Można zagwarantować, że serwlet będzie obsługiwał tylko jedno żądanie naraz implementując pusty interfejs SingleThreadModel (serwer J2EE może wtedy synchronizować dostęp do serwletu lub tworzyć wiele komponentów Web'owych i kierować żądania do aktualnie wolnego egzemplarza) Zawsze jednak trzeba zabezpieczyć się przed niepoprawnym użyciem zasobów dzielonych stosując metody synchronizacji wątków

Współdzielenie informacji Każda aplikacja webowa (web application) posiada kontekst wykonania na serwerze J2EE, jest on reprezentowany przez obiekt klasy ServletContext Konteksty są tworzone przez serwer J2EE podczas jego startu, ew. przy przeładowaniu aplikacji, na podstawie globalnego dla aplikacji pliku web.xml Istnieje jeden kontekst dla każdej aplikacji na każdej maszynie wirtualnej, na której jest ona uruchomiona Klasa Servlet umożliwia dostęp do swojego kontekstu poprzez metodę getServletContext()

Współdzielenie informacji Architektura serwletów umożliwia posiadanie informacji globalnej dla całej aplikacji webowej. W tym celu trzeba użyć metod setAttribute() oraz getAttribute() klasy ServletContext W przypadku aplikacji rozproszonej, działającej na kilku komputerach (maszynach wirtualnych), kontekstów jest wiele, więc nie można użyć ich do przechowywania dzielonej informacji – trzeba użyć innego mechanizmu, np. bazy danych void setAttribute(String name, Object object) Object getAttribute(String name) (!) potrzebne rzutowanie void removeAttribute(String name)

Zdarzenia cyklu życia serwletu Architektura serwletów przewiduje także możliwość monitorowania i reagowania na zdarzenia związane z cyklem życia serwletu (zdarzenia dotyczące aplikacji lub sesji), poprzez zdefiniowanie obiektów nasłuchujących (listeners) W tym celu wystarczy utworzyć klasę implementującą odpowiedni interfejs (ServletContextListener, ServletContextAttributeListener, HttpSessionListener lub HttpSessionAttributeListener) oraz powiązać ją z odpowiednią sekcją w pliku web.xml

Interfejsy zdarzeń serwletu Zasięg Zdarzenie Interfejs nasłuchujący oraz klasa zdarzenia Kontekst aplikacji Inicjalizacja, destrukcja ServletContextListener ServletContextEvent Dodano, zmieniono lub usunięto atrybut ServletContextAttributeListener ServletContextAttributeEvent Sesja Utworzenie, unieważnienie, przeterminowanie HttpSessionListener HttpSessionEvent HttpSessionAttributeListener HttpSessionBindingEvent

Sesje w serwletach HTTP Sesje są reprezentowane przez obiekty HttpSession Dostęp do sesji odbywa się przez wywołanie metody obiektu żądania: request.getSession() – zwraca ona obiekt sesji związany z żądaniem lub tworzy nową sesję, jeśli żądanie nie ma jeszcze obiektu sesji Użycie sesji może spowodować wysłanie nagłówka HTTP, więc obiekt sesji musi być odczytany przed uzyskaniem obiektu strumienia PrintWriter Obiekt sesji służy głównie do przechowywania par atrybut-wartość, wykorzystuje się tu metody setAttribute() oraz getAttribute()

Zarządzanie sesjami Stworzenie sesji, jej modyfikacje, unieważnienie, czy przeterminowanie (timeout) generują zdarzenia, na które może reagować obiekt nasłuchujący (np. wykonując odczyt lub zapis do bazy danych) Mechanizm sesji przechowuje wszystkich informacje związane z sesją na serwerze, zaś do użytkownika wysyłany jest jedynie identyfikator sesji w postaci ciasteczka (cookie) Aby radzić sobie z sytuacją, gdy użytkownik wyłączy ciasteczka lub ich nie obsługuje, należy używać metody response.encodeURL() – która w takim przypadku dopisuje identyfikator sesji do adresu

Dostęp współbieżny do zasobów dzielonych Dobrym sposobem na dzielenie informacji pomiędzy wieloma serwletami jednej aplikacji jest utworzenie dodatkowej klasy (klasy zasobów), która będzie przechowywać dane i udostępniać metody do ich odczytu i modyfikacji – obiekt tej klasy można udostępnić w kontekście aplikacji (ServletContext) Powstaje jednak problem, gdy wiele serwletów (lub wątków) chce równocześnie modyfikować dane Jednym z rozwiązań jest opatrzenie metod klasy zasobów modyfikatorem synchronized