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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Jsroka (dyskusja | edycje)
Jsroka (dyskusja | edycje)
Linia 176: Linia 176:
  zad2.ElementListy@750159(el2, @1abab88, @10b4b2f)
  zad2.ElementListy@750159(el2, @1abab88, @10b4b2f)
  zad2.ElementListy@1abab88(el3, @10b4b2f, @750159)
  zad2.ElementListy@1abab88(el3, @10b4b2f, @750159)
</div>
</div>}}
zad3
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.
{{rozwiazanie| ||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
'''class''' GłębokaKopia '''implements''' Serializable {
  '''static''' '''public''' Object kopiuj(Object obj) '''throws''' IOException, ClassNotFoundException {
    ByteArrayOutputStream bos = '''new''' ByteArrayOutputStream();
    ObjectOutputStream oos = '''new''' ObjectOutputStream(bos);
    oos.writeObject(obj);
    oos.close();
    ByteArrayInputStream bis = '''new''' ByteArrayInputStream(bos.toByteArray());
    ObjectInputStream ois = '''new''' ObjectInputStream(bis);
    Object o = ois.readObject();
    ois.close();
    '''return''' o;
  }
}
'''public''' '''class''' Zad3 {
  '''public''' '''static''' '''void''' main(String[] args) '''throws''' Exception {
    ElementListy el1, el2, el3;
    el1 = '''new''' ElementListy("el1");
    el2 = '''new''' ElementListy("el2");
    el3 = '''new''' ElementListy("el3");
    el1.setNastępny(el2);
    el1.setPoprzedni(el3);
    el2.setNastępny(el3);
    el2.setPoprzedni(el1);
    el3.setNastępny(el1);
    el3.setPoprzedni(el2);
   
    System.out.println("Przed kopią");
    System.out.println(el1);
    System.out.println("Po kopii");
    System.out.println((ElementListy) GłębokaKopia.kopiuj(el1));
  }
}
wywołanie konstruktora klasy ElementListy
wywołanie konstruktora klasy ElementListy
wywołanie konstruktora klasy ElementListy
Przed kopią
zad3.ElementListy@1372a1a(el1, @ad3ba4, @126b249)
Po kopii
zad3.ElementListy@1abab88(el1, @18a7efd, @1971afc)
</div>
</div>
</div>}}
</div>}}

Wersja z 23:13, 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}}}

zad3 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}}}