Programowanie obiektowe

Podobne dokumenty
Programowanie obiektowe

Strumienie i serializacja

Java niezbędnik programisty spotkanie nr 11. Importy statyczne, wejście/wyjście, wyrażenia regularne, serializacja

Java. Programowanie Obiektowe Mateusz Cicheński

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

STRUMIENIE DANYCH, SERIALIZACJA OBIEKTÓW

Wywoływanie metod zdalnych

Programowane refleksyjne i serializacja

Wywoływanie metod zdalnych

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Programowanie obiektowe

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Remote Method Invocation 17 listopada 2010

Podstawy otwartych języków programowania Wyjątki i strumienie I/O

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Podejście obiektowe do budowy systemów rozproszonych

Platformy Programistyczne Zagadnienia sieciowe i wątki

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Wykład 6 Dziedziczenie cd., pliki

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

1 Klasa File. 2 Writer. Programowanie w j zyku Java - Adam Krechowicz. Klasa File zapewnia podstawowe operacje na plikach

Aplikacje RMI

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Wykład 7: Pakiety i Interfejsy

WSNHiD, Programowanie 2, Lab. 3. Trwałość danych

Programowanie obiektowe

Aplikacje RMI Lab4

Programowanie rozproszone w języku Java

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

1 Atrybuty i metody klasowe

XML i Java. Technologie zarządzania treścią. dr inż. Robert Perliński rperlinski@icis.pcz.pl

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Aplikacja wielowątkowa prosty komunikator

Podstawy i języki programowania

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Multimedia JAVA. Historia

sieć 4) Mechanizm RMI jest zazwyczaj wykorzystywany w rozwiązaniach typu klient-serwer.

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Programowanie obiektowe

Bezpieczeństwo w aplikacjach Java

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie w Internecie. Java

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Języki i metody programowania Java. Wykład 2 (część 2)

Java niezbędnik programisty spotkanie nr 3. Modyfikatory, jednostki kompilacji, tworzenie/inicjalizacja, odśmiecanie/ finalizacja...

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Język JAVA podstawy. Wykład 6, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Wykład 8: Obsługa Wyjątków

Programowanie obiektowe

Klasy abstrakcyjne, interfejsy i polimorfizm

Metody dostępu do danych

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Programowanie obiektowe

Dokumentacja do API Javy.

Programowanie obiektowe zastosowanie języka Java SE

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie Obiektowe Ćwiczenie 4

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

JAX-RS czyli REST w Javie. Adam Kędziora

Wykład 4: Wejście/wyjście: strumienie Java

Programowanie obiektowe

Programowanie obiektowe

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

JAVA I SIECI. MATERIAŁY:

Przygotował: Jacek Sroka 1. Java SE. Strumienie

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Wykład 2: Podstawy Języka

Definiowanie własnych klas

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe

Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8

Aplikacja wielow tkowa prosty komunikator

Podstawy obiektowości

Interfejsy w Javie. Przykład zastosowania interfejsów:

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

KLASY, INTERFEJSY, ITP

Strumienie, pliki. Sortowanie. Wyjątki.

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Java jako język programowania

MAS dr. Inż. Mariusz Trzaska. Wykorzystanie klas w obiektowych językach

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Java w 21 dni / Rogers Cadenhead. Gliwice, cop Spis treści. O autorze 11. Wprowadzenie 13 TYDZIEŃ I JĘZYK JAVA

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Transkrypt:

Przygotował: Jacek Sroka 1 Programowanie obiektowe Wykład 9 Serializacja

Przygotował: Jacek Sroka 2 Przypomnienie Abstrakcja strumienia hierarchia binarna InputStream/OutputStream hierarchia znakowa Reader/Writer Wzorzec Dekorator Podstawowe typy strumienie skąd uzyskać strumienie do innych źródeł, np. gniazd sieciowych, zasobów sieci WWW Kodowanie znaków Podstawowe operacje na strumieniach ułatwienia Kompresja, szyfrowanie Standardowe wejście/wyjście NIO

Przygotował: Jacek Sroka 3 Zapisywanie całych obiektów Atrybutami obiektów mogą być inne obiekty Serializacj/deserializacja do postaci binarnej do Extensible Markup Language (XML) dokumenty XML zazwyczaj są zrozumiałe dla człowieka nawet jeżeli nie towarzyszy im stosowna dokumentacja, istnieją ogólnie przyjęte specyfikacje określających jak parsować i transformować dokumenty XML oraz wiele łatwo dostępnych narzędzi i bibliotek implementujących te specyfikacje, XML jest powszechnie stosowany do wymiany danych, zarówno w aplikacjach biurkowych, np. formaty zapisu dokumentów pakietów OpenOffice, jak i rozwiązaniach serwerowych, np. usługi Web Services Zastosowania lekka trwałość zachowanie danych między uruchomieniami aplikacji dane nie mieszczą się w pamięci zabezpieczenie przed utratą danych najlepiej stosować bazy danych (np. łatwe wyszukiwanie) programowanie rozproszone Remote Method Invocation (RMI), Enterprise Java Beans (EJB),...

Przygotował: Jacek Sroka 4 Serializacja w Javie ObjectOutputStream i ObjectInputStream void writeobject(object) Object readobject() interfejs java.io.serializable nie posiada żadnych metod znacznik implementowany przez większość klas ze standardowych bibliotek, np. klasy opakowujące i String Serializowany jest cały graf dostępnych obiektów domknięcie (ang. closure)

Przygotował: Jacek Sroka 5 Przykład import java.io.*; class Osoba implements Serializable { String nazwisko; String imię; Adres adreszameldowania; Osoba(String nazwisko, String imię, Adres adreszameldowania) { this.nazwisko = nazwisko; this.imię = imię; this.adreszameldowania = adreszameldowania; System.out.println("wywołanie konstruktora klasy Osoba"); public String tostring() { String adrpamięć = super.tostring(); return adrpamięć+"(" + nazwisko + ", " + imię + ", " + adreszameldowania + ")";

Przygotował: Jacek Sroka 6 Przykład c.d. class Adres implements Serializable { String miasto; String ulica; String nrdomu; String nrlokalu; Adres(String miasto, String ulica, String nrdomu, String nrlokalu) { this.miasto = miasto; this.ulica = ulica; this.nrdomu = nrdomu; this.nrlokalu = nrlokalu; System.out.println("wywołanie konstruktora klasy Adres"); public String tostring() { String adrpamięć = super.tostring(); return adrpamięć + "(" + miasto + ", " + ulica + ", " + nrdomu + ", " + nrlokalu + ")";

Przygotował: Jacek Sroka 7 Przykład c.d. public class TestSerializacji { public static void main(string[] args) throws Exception { Adres alternatywy4 = new Adres("Warszawa", "Alternatywy", "4", "9"); Osoba kotek = new Osoba("Kotek", "Zygmunt", alternatywy4); System.out.println(kotek); // wersja dla Linuxa String nazwapliku = "/tmp/lista.ser"; // wersja dla Windows //String nazwapliku = "c:\\lista.ser"; ObjectOutputStream out = new ObjectOutputStream( new BufferedOutputStream( new FileOutputStream(nazwaPliku))); out.writeobject("lista lokatorów"); out.writeobject(kotek); out.close(); ObjectInputStream in = new ObjectInputStream( new BufferedInputStream( new FileInputStream(nazwaPliku))); String nagłówek = (String) in.readobject(); kotek = (Osoba) in.readobject(); in.close(); System.out.println(kotek);

Przygotował: Jacek Sroka 8 Wynik Po odczytaniu dostaliśmy nowy obiekt o takiej samej zawartości Nie doszło do wykonania żadnych konstruktorów //wywołanie konstruktora klasy Adres //wywołanie konstruktora klasy Osoba //Osoba@1372a1a(Kotek, Zygmunt, Adres@ad3ba4(Warszawa, Alternatywy, 4, 9)) //Osoba@1c39a2d(Kotek, Zygmunt, Adres@bf2d5e(Warszawa, Alternatywy, 4, 9))

Przygotował: Jacek Sroka 9 Kilka referencji wskazujących ten sam obiekt Algorytm przechodzący domknięcie jest przygotowany na występowanie cykli nie dojdzie do powielenia współdzielonych atrybutów Własność ta jest zachowana również przy serializowaniu kilku grafów do tego samego strumienia po deserializacji grafy zachowają część wspólną

Przygotował: Jacek Sroka 10 Przykład Adres alternatywy4 = new Adres("Warszawa", "Alternatywy", "4", "9"); Osoba kotek = new Osoba("Kotek", "Zygmunt", alternatywy4); Osoba kołek= new Osoba("Kołek", "Zdzisław", alternatywy4); System.out.println(kotek); System.out.println(kołek); String nazwapliku = "/tmp/lista.ser"; ObjectOutputStream out = new ObjectOutputStream( new BufferedOutputStream( new FileOutputStream(nazwaPliku))); out.writeobject("lista lokatorów"); out.writeobject(kotek); out.writeobject(kołek); out.close(); ObjectInputStream in = new ObjectInputStream( new BufferedInputStream( new FileInputStream(nazwaPliku))); String nagłówek = (String) in.readobject(); kotek = (Osoba) in.readobject(); kołek = (Osoba) in.readobject(); in.close(); System.out.println(kotek); System.out.println(kołek);

Przygotował: Jacek Sroka 11 Wynik Po deserializacji oba adresy nie tylko mają tą samą zawartość ale są tym samym obiektem //wywołanie konstruktora klasy Adres //wywołanie konstruktora klasy Osoba //wywołanie konstruktora klasy Osoba //Osoba@1372a1a(Kotek, Zygmunt, Adres@ad3ba4(Warszawa, Alternatywy, 4, 9)) //Osoba@126b249(Kołek, Zdzisław, Adres@ad3ba4(Warszawa, Alternatywy, 4, 9)) //Osoba@df8ff1(Kotek, Zygmunt, Adres@1632c2d(Warszawa, Alternatywy, 4, 9)) //Osoba@1e97676(Kołek, Zdzisław, Adres@1632c2d(Warszawa, Alternatywy, 4, 9))

Przygotował: Jacek Sroka 12 Kontrolowanie serializacji Domyślnie serializacji podlegają wszystkie składowe, nawet prywatne Kiedy nie jest to wskazane dane poufne, np. hasła niektórych obiektów nie ma sensu serializować, np. strumieni i wątków Dodatkowo jeżeli przy próbie serializacji obiektów, które zawierają składowe nieimplementujące java.io.serializable zgłaszany jest wyjątek java.io.notserializableexception niestety do nieswojego kodu nie możemy dodać Serializable Można wskazać atrybuty, które mają być pomijane przez domyślny mechanizm serializacji zrezygnować z domyślnego mechanizmu (obsłużyć serializację/deserializację samemu)

Przygotował: Jacek Sroka 13 Przykład wskazanie atrybutów class Osoba implements Serializable { String nazwisko; String imię; transient Adres adreszameldowania; Osoba(String nazwisko, String imię, Adres adreszameldowania) { this.nazwisko = nazwisko; this.imię = imię; this.adreszameldowania = adreszameldowania; System.out.println("wywołanie konstruktora klasy Osoba"); public String tostring() { String adrpamięć = super.tostring(); return adrpamięć+"(" + nazwisko + ", " + imię + ", " + adreszameldowania + ")";

Przygotował: Jacek Sroka 14 Wynik Po deserializacji na składowych transient mamy wartość domyślną dla danego typu //wywołanie konstruktora klasy Adres //wywołanie konstruktora klasy Osoba //wywołanie konstruktora klasy Osoba //Osoba1@1372a1a(Kotek, Zygmunt, Adres@ad3ba4(Warszawa, Alternatywy, 4, 9)) //Osoba1@126b249(Kołek, Zdzisław, Adres@ad3ba4(Warszawa, Alternatywy, 4, 9)) //Osoba1@750159(Kotek, Zygmunt, null) //Osoba1@1abab88(Kołek, Zdzisław, null)

Przygotował: Jacek Sroka 15 Samodzielna obsługa serializacji Zamiast domyślnego mechanizmu serializacji/deserializacji mogą być użyte metody private void writeobject(objectoutputstream oos) throws IOException; private void readobject(objectinputstream ois) throws IOException, ClassNotFoundException Rozszerzenie domyślnego mechanizmu możemy uzyskać przez wykonanie na przekazanym jako parametr strumieni defaultwriteobject() oraz defaultreadobject() przydaje się do samodzielnego obsłużenia składowych nieimplementujących Serializable Oraz jak chcemy na standardowo serializowanych atrybutach wykonać jeszcze jakieś przekształcenia, np. kompresję/dekompresję lub kontrolę sumy kontrolnej

Przygotował: Jacek Sroka 16 Przykład class Osoba implements Serializable { String nazwisko; String imię; transient Adres adreszameldowania; private void writeobject(objectoutputstream oos) throws IOException { System.out.println("writeObject()"); oos.defaultwriteobject(); oos.writeobject(adreszameldowania); private void readobject(objectinputstream ois) throws... { System.out.println("readObject()"); ois.defaultreadobject(); adreszameldowania = (Adres) ois.readobject(); Osoba(String nazwisko, String imię, Adres adreszameldowania) { this.nazwisko = nazwisko; this.imię = imię; this.adreszameldowania = adreszameldowania; System.out.println("wywołanie konstruktora klasy Osoba"); public String tostring() {...

Przygotował: Jacek Sroka 17 Inny sposób zastąpienia domyślnego mechanizmu Klasa może implementować interfejs java.io.externalizable void writeexternal(objectoutput out) throws IOException void readexternal(objectinput in) throws IOException, ClassNotFoundException java.io.externalizable jest podinterfejsem java.io.serializable można przekazywać do metody writeobject() może występować w domknięciu serializowanego obiektu Ograniczenia Nie można wspomóc się domyślnym mechanizmem serializacji Dochodzi do wywołania domyślnego konstruktora (musi być i być publiczny) jak nie ma to java.io.invalidclassexception Zalety Można stosować w hierarchii klas (w poprzednim sposobie metody były prywatne) Pytanie: Jaką widoczność mają metody writeexternal()/readexternal()?

Przygotował: Jacek Sroka 18 Dostępność definicji klasy Deserializowana klasa musi być widoczna (w CLASSPATH) przez JVM, która dokonuje deserializacji wpp. java.lang.classnotfoundexception Nazwa serializowanej klasy zawsze ląduje w strumieniu niezależnie który mechanizm serializacji był użyty

Przygotował: Jacek Sroka 19 Przykład import java.io.*; class KlasaONiedostępnejDefinicji implements Serializable { public class TestWersjonowania { public static void main(string[] args) throws Exception { // wersja dla Linuxa String nazwapliku = "/tmp/test.ser"; // wersja dla Windows //String nazwapliku = "c:\\test.ser"; ObjectOutputStream oos = new ObjectOutputStream( new BufferedOutputStream( new FileOutputStream(nazwaPliku))); oos.writeobject(new KlasaONiedostępnejDefinicji()); oos.close();

Przygotował: Jacek Sroka 20 Przykład c.d. import java.io.*; public class PróbaOdczytu { public static void main(string[] args) throws Exception { ObjectInputStream ois = null; try { // wersja dla Linuxa String nazwapliku = "/tmp/test.ser"; // wersja dla Windows //String nazwapliku = "c:\\test.ser"; ois = new ObjectInputStream( new BufferedInputStream( new FileInputStream(nazwaPliku))); Object obj = ois.readobject(); catch (Exception e) { System.out.println(e); finally { try { ois.close(); catch (Exception e) { System.out.println("Nie udało się zamknąć strumienia");

Przygotował: Jacek Sroka 21 Wersjonowanie A co jeżeli definicja klasy się zmieniła? serializacja trwałą długo inna maszyna wirtualna ma inną wersję aplikacji Przy interfejsie Externalizable sami odpowiadamy obsługę wersjonowania Dla Serializable (ale nie Externalizable) wersjonowanie jest automatyczne Generowany jest unikatowy odcisk typu long na podstawie: nazwy klasy i użytych przy jej definicji modyfikatorów nazw wszystkich interfejsów implementowanych przez klasę opisu wszystkich metod i konstruktorów oprócz metod i konstruktorów prywatnych opisu wszystkich atrybutów poza atrybutami prywatnymi, statycznymi i oznaczonymi jako transient Jeśli identyfikatory nie pasują zgłaszany jest java.io.invalidclassexception Domyślne, ostrożne zachowanie można zmienić ustawiając static final long serialversionuid

Przygotował: Jacek Sroka 22 Przykład Serializowana klasa class KlasaOZmieniającejSięDefinicji implements Serializable { static final long serialversionuid = 2L; String staryatrybut = "jakaś wartość"; Definicja przy deserializacji class KlasaOZmieniającejSięDefinicji implements Serializable { static final long serialversionuid = 2L; String nowyatrybut = "deserializacja nie przypisze tej wartości"; Zapamiętana wartość usuniętego atrybutu zostanie zignorowana Nowy atrybut będzie miał wartość domyślną dla swojego typu Nie zostanie nawet wyliczone wyrażenie inicjalizujące Domyślną wartość UID można odczytać narzędziem serialver (wchodzi w skłąd JDK tak jak javac)