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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Jsroka (dyskusja | edycje)
Jsroka (dyskusja | edycje)
Linia 224: Linia 224:
  Po kopii
  Po kopii
  zad3.ElementListy@1abab88(el1, @18a7efd, @1971afc)
  zad3.ElementListy@1abab88(el1, @18a7efd, @1971afc)
</div>
</div>}}
== 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.
{{rozwiazanie| przed zresetowaniem pamięci podręcznej ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
'''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 + ")";
  }
}
'''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 + ")";
  }
}
'''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);
    Osoba kołek= '''new''' Osoba("Kołek", "Zdzisław", alternatywy4);
    System.out.println(kotek);
    System.out.println(kołek);
    // 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);
    // Wspólne obiekty mają wartość z chwili, gdy pierwszy raz wystąpią w serializowanym grafie.
    alternatywy4.nrLokalu = "10";
    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);
  }
}
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@1372a1a(Kotek, Zygmunt, Adres@ad3ba4(Warszawa, Alternatywy, 4, 9))
Osoba@126b249(Kołek, Zdzisław, Adres@ad3ba4(Warszawa, Alternatywy, 4, 9))
</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">
Po zresetowaniu pamięci podręcznej po zdeserializowaniu grafy nie będą dzieliły żadnych obiektów.
'''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 + ")";
  }
}
'''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 + ")";
  }
}
'''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);
    Osoba kołek= '''new''' Osoba("Kołek", "Zdzisław", alternatywy4);
    System.out.println(kotek);
    System.out.println(kołek);
    // 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);
    // Wspólne obiekty mają wartość z chwili, gdy pierwszy raz wystąpią w serializowanym grafie.
    alternatywy4.nrLokalu = "10";
    // Po zresetowaniu pamięci podręcznej po zdeserializowaniu grafy nie będą dzieliły żadnych obiektów.
    out.reset();
    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);
  }
}
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@1632c2d(Kotek, Zygmunt, Adres@1e97676(Warszawa, Alternatywy, 4, 9))
Osoba@60420f(Kołek, Zdzisław, Adres@19106c7(Warszawa, Alternatywy, 4, 10))
</div>
</div>
</div>}}
</div>}}

Wersja z 23:48, 11 wrz 2006

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.

Rozwiązanie

{{{3}}}

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

{{{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 el1używanego w rozwiązaniu poprzedniego zadania.

Rozwiązanie

{{{3}}}

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

{{{3}}}

Rozwiązanie po zresetowaniu pamięci podręcznej

{{{3}}}