PO Serializacja - ćwiczenia: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Jsroka (dyskusja | edycje)
 
(Nie pokazano 9 wersji utworzonych przez 3 użytkowników)
Linia 1: Linia 1:
{{powrot|Programowanie obiektowe|do przedmiotu Programowanie obiektowe}}
{{powrot|PO Serializacja|do wykładu Serializacja}}
== Zadanie 1 ==
== Zadanie 1 ==
Rozszerz klasę Osoba, aby posiadała dwa adresy – adres zameldowania i adres zamieszkania. W klasie ''SerializacjTest'' ustaw Zygmuntowi Kotkowi oba rodzaje adresów na ''alternatywy4''. Sprawdź, że po deserializacji oba adresy są nadal jednym obiektem.
Rozszerz klasę Osoba, aby posiadała dwa adresy – adres zameldowania i adres zamieszkania. W klasie ''SerializacjTest'' ustaw Zygmuntowi Kotkowi oba rodzaje adresów na ''alternatywy4''. Sprawdź, czy po deserializacji oba adresy są nadal jednym obiektem.
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{rozwiazanie| ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.io.*;
  '''import''' java.io.*;
   
   
Linia 81: Linia 86:
  Osoba@bf2d5e(Kotek, Zygmunt, Adres@13bad12(Warszawa, Alternatywy, 4, 9), Adres@13bad12(Warszawa, Alternatywy, 4, 9))
  Osoba@bf2d5e(Kotek, Zygmunt, Adres@13bad12(Warszawa, Alternatywy, 4, 9), Adres@13bad12(Warszawa, Alternatywy, 4, 9))
</div>
</div>
</div>}}
</div>


== Zadanie 2 ==
== Zadanie 2 ==
Używając podanej poniżej klasy ''ElementListy'' przygotuj trzyelementowy cykl i zserializuj go do pliku, a następnie zdeserializuj. Sprawdź, czy rzeczywiście jeżeli przed serializacją jakiś obiekt był przypisany na kilka różnych referencji, to po deserializacji nadal będzie na te referencje przypisany jeden obiekt.
Używając podanej poniżej klasy ''ElementListy'' przygotuj trzyelementowy cykl i zserializuj go do pliku, a następnie zdeserializuj. Sprawdź, czy rzeczywiście, jeżeli przed serializacją jakiś obiekt był przypisany na kilka różnych referencji, to po deserializacji nadal będzie na te referencje przypisany jeden obiekt.
  '''class''' ElementListy '''implements''' Serializable {
  '''class''' ElementListy '''implements''' Serializable {
   String wartość;
   String wartość;
Linia 123: Linia 128:
  }
  }


{{rozwiazanie| ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.io.*;
  '''import''' java.io.*;
   
   
Linia 177: Linia 184:
  zad2.ElementListy@1abab88(el3, @10b4b2f, @750159)
  zad2.ElementListy@1abab88(el3, @10b4b2f, @750159)
</div>
</div>
</div>}}
</div>


== Zadanie 3 ==
== Zadanie 3 ==
Przygotuj klasę ''GłębokaKopia'', której statyczna metoda ''kopiuj(Object)'' będzie wykonywała '''w pamięci''' głęboką (kopię całego grafu) kopię obiektu przekazanego jej jako parametr i zwracała ją jako wynik. Użyj napisanej klasy do wykonania głębokiej kopi cyklu ''el1'' używanego w rozwiązaniu poprzedniego zadania.
Przygotuj klasę ''GłębokaKopia'', której statyczna metoda ''kopiuj(Object)'' będzie wykonywała '''w pamięci''' głęboką kopię (całego grafu) obiektu przekazanego jej jako parametr i zwracała ją jako wynik. Użyj napisanej klasy do wykonania głębokiej kopi cyklu ''el1'' używanego w rozwiązaniu poprzedniego zadania.
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{rozwiazanie| ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<div class="mw-collapsible-content" style="display:none">
  '''class''' GłębokaKopia '''implements''' Serializable {
  '''class''' GłębokaKopia '''implements''' Serializable {
   '''static''' '''public''' Object kopiuj(Object obj) '''throws''' IOException, ClassNotFoundException {
   '''static''' '''public''' Object kopiuj(Object obj) '''throws''' IOException, ClassNotFoundException {
Linia 225: Linia 233:
  zad3.ElementListy@1abab88(el1, @18a7efd, @1971afc)
  zad3.ElementListy@1abab88(el1, @18a7efd, @1971afc)
</div>
</div>
</div>}}
</div>


== Zadanie 4 ==
== Zadanie 4 ==
W metodzie ''main()'' klasy ''TestSerializacji'' po zserializowaniu obiektu ''kotek'', ale przed zserializowaniem obiektu ''kołek'' zmień wartość adresu ''alternatywy4''. Sprawdź czy zmiana jest widoczna po desrializacji. Ten sam eksperyment wykonaj resetując pamięć podręczną strumienia ''ObjectOutputStream'' pomiędzy zapisem kolejnych grafów.
W metodzie ''main()'' klasy ''TestSerializacji'' po zserializowaniu obiektu ''kotek'', ale przed zserializowaniem obiektu ''kołek'' zmień wartość adresu ''alternatywy4''. Sprawdź, czy zmiana jest widoczna po desrializacji. Ten sam eksperyment wykonaj resetując pamięć podręczną strumienia ''ObjectOutputStream'' pomiędzy zapisem kolejnych grafów.
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{rozwiazanie| przed zresetowaniem pamięci podręcznej ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie przed zresetowaniem pamięci podręcznej</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.io.*;
  '''import''' java.io.*;
   
   
Linia 317: Linia 326:
  Osoba@126b249(Kołek, Zdzisław, Adres@ad3ba4(Warszawa, Alternatywy, 4, 9))
  Osoba@126b249(Kołek, Zdzisław, Adres@ad3ba4(Warszawa, Alternatywy, 4, 9))
</div>
</div>
</div>}}
</div>


{{rozwiazanie| po zresetowaniu pamięci podręcznej ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie po zresetowaniu pamięci podręcznej</span>
<div class="mw-collapsible-content" style="display:none">
Po zresetowaniu pamięci podręcznej po zdeserializowaniu grafy nie będą dzieliły żadnych obiektów.
Po zresetowaniu pamięci podręcznej po zdeserializowaniu grafy nie będą dzieliły żadnych obiektów.
  '''import''' java.io.*;
  '''import''' java.io.*;
Linia 409: Linia 420:
  Osoba@60420f(Kołek, Zdzisław, Adres@19106c7(Warszawa, Alternatywy, 4, 10))
  Osoba@60420f(Kołek, Zdzisław, Adres@19106c7(Warszawa, Alternatywy, 4, 10))
</div>
</div>
</div>}}
</div>


== Zadanie 5 ==
== Zadanie 5 ==
Wymyśl sposób na zabronienie wykonywania serializacji na danej klasie. Niech każda próba serializacji zgłasza wyjątek. Podaj przykład tak zabezpieczonej klasy oraz spróbuj ją zserializować.
Wymyśl sposób na zabronienie wykonywania serializacji na danej klasie. Niech każda próba serializacji zgłasza wyjątek. Podaj przykład tak zabezpieczonej klasy oraz spróbuj ją zserializować.
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
{{wskazowka| ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span>
<div class="mw-collapsible-content" style="display:none">
Zaimplementuj metody ''writeObject()'' i ''readObject()''.
Zaimplementuj metody ''writeObject()'' i ''readObject()''.
</div>
</div>
</div>}}
</div>


{{rozwiazanie| ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.io.*;
  '''import''' java.io.*;
   
   
Linia 451: Linia 465:
  }
  }
</div>
</div>
</div>}}
</div>


== Zadanie 6 ==
== Zadanie 6 ==
Wymyśl sposób na zabronienie wykonywania serializacji na danej klasie i wszystkich jej podklasach. Podaj przykład tak zabezpieczonej klasy oraz spróbuj ją zserializować.
Wymyśl sposób na zabronienie wykonywania serializacji na danej klasie i wszystkich jej podklasach. Podaj przykład tak zabezpieczonej klasy oraz spróbuj ją zserializować.


{{wskazowka| ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span>
<div class="mw-collapsible-content" style="display:none">
Zaimplementuj interfejs ''Externalizable''.
Zaimplementuj interfejs ''Externalizable''.
</div>
</div>
</div>}}
</div>


{{rozwiazanie| ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.io.*;
  '''import''' java.io.*;
   
   
Linia 493: Linia 511:
  }
  }
</div>
</div>
</div>}}
</div>


== Zadanie 7 ==
== Zadanie 7 ==
sprawdź jak klasa ''XMLEncoder'' wypisze cykl ''el1'' występujący w rozwiązaniu zadania 2.
Sprawdź, jak klasa ''XMLEncoder'' wypisze cykl ''el1'' występujący w rozwiązaniu zadania 2.


{{rozwiazanie| klasa ''ElementListy''||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie klasa ''ElementListy''</span>
<div class="mw-collapsible-content" style="display:none">
  '''public''' '''class''' ElementListy {
  '''public''' '''class''' ElementListy {
   String wartość;
   String wartość;
Linia 549: Linia 569:
  }
  }
</div>
</div>
</div>}}
</div>


{{rozwiazanie| klasa ''Zad7''||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie klasa ''Zad7''</span>
<div class="mw-collapsible-content" style="display:none">
  '''import''' java.beans.*;
  '''import''' java.beans.*;
  '''import''' java.io.*;
  '''import''' java.io.*;
Linia 584: Linia 606:
  }
  }
</div>
</div>
</div>}}
</div>


{{rozwiazanie| wynikowy XML ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie wynikowy XML</span>
<div class="mw-collapsible-content" style="display:none">
  <?xml version="1.0" encoding="UTF-8"?>  
  <?xml version="1.0" encoding="UTF-8"?>  
  <java version="1.5.0_06" class="java.beans.XMLDecoder">  
  <java version="1.5.0_06" class="java.beans.XMLDecoder">  
Linia 622: Linia 646:
  </java>
  </java>
</div>
</div>
</div>}}
</div>

Aktualna wersja na dzień 21:34, 28 maj 2020

<<< Powrót do przedmiotu Programowanie obiektowe

<<< Powrót do wykładu Serializacja

Zadanie 1

Rozszerz klasę Osoba, aby posiadała dwa adresy – adres zameldowania i adres zamieszkania. W klasie SerializacjTest ustaw Zygmuntowi Kotkowi oba rodzaje adresów na alternatywy4. Sprawdź, czy po deserializacji oba adresy są nadal jednym obiektem.

Rozwiązanie

Zadanie 2

Używając podanej poniżej klasy ElementListy przygotuj trzyelementowy cykl i zserializuj go do pliku, a następnie zdeserializuj. Sprawdź, czy rzeczywiście, jeżeli przed serializacją jakiś obiekt był przypisany na kilka różnych referencji, to po deserializacji nadal będzie na te referencje przypisany jeden obiekt.

class ElementListy implements Serializable {
  String wartość;
  ElementListy następny, poprzedni;
  
  ElementListy(String wartość) {
    this.wartość = wartość;
    System.out.println("wywołanie konstruktora klasy ElementListy");
  }
  
  protected String memAddress() {
    String adrPamięć = super.toString();
    return adrPamięć.substring(adrPamięć.indexOf('@'));
  }
  
  public String toString() {
    String adrPamięć = super.toString();
    return adrPamięć+"(" + wartość + ", " +
                           następny.memAddress() + ", " +
                           poprzedni.memAddress() + ")";
  }

  public ElementListy getNastępny() {
    return następny;
  }

  public ElementListy getPoprzedni() {
    return poprzedni;
  }

  public void setPoprzedni(ElementListy poprzedni) {
    this.poprzedni = poprzedni;
  }
  
  public void setNastępny(ElementListy następny) {
    this.następny = następny;
  }
}

Rozwiązanie

Zadanie 3

Przygotuj klasę GłębokaKopia, której statyczna metoda kopiuj(Object) będzie wykonywała w pamięci głęboką kopię (całego grafu) obiektu przekazanego jej jako parametr i zwracała ją jako wynik. Użyj napisanej klasy do wykonania głębokiej kopi cyklu el1 używanego w rozwiązaniu poprzedniego zadania.

Rozwiązanie

Zadanie 4

W metodzie main() klasy TestSerializacji po zserializowaniu obiektu kotek, ale przed zserializowaniem obiektu kołek zmień wartość adresu alternatywy4. Sprawdź, czy zmiana jest widoczna po desrializacji. Ten sam eksperyment wykonaj resetując pamięć podręczną strumienia ObjectOutputStream pomiędzy zapisem kolejnych grafów.

Rozwiązanie przed zresetowaniem pamięci podręcznej

Rozwiązanie po zresetowaniu pamięci podręcznej

Zadanie 5

Wymyśl sposób na zabronienie wykonywania serializacji na danej klasie. Niech każda próba serializacji zgłasza wyjątek. Podaj przykład tak zabezpieczonej klasy oraz spróbuj ją zserializować.

Wskazówka

Rozwiązanie

Zadanie 6

Wymyśl sposób na zabronienie wykonywania serializacji na danej klasie i wszystkich jej podklasach. Podaj przykład tak zabezpieczonej klasy oraz spróbuj ją zserializować.

Wskazówka

Rozwiązanie

Zadanie 7

Sprawdź, jak klasa XMLEncoder wypisze cykl el1 występujący w rozwiązaniu zadania 2.

Rozwiązanie klasa ElementListy

Rozwiązanie klasa Zad7

Rozwiązanie wynikowy XML