Wykład 14
Serializacja obiektów – zapis i odczyt aplikacji do/z pliku
Przykład 1 – Serializacja aplikacji w dwóch strumieniach – utrata powiązań między danymi
import java.io.*;
import java.util.*;
class TProdukt1 implements Serializable { protected String nazwa = "";
protected float cena = 0;
public TProdukt1 (String anazwa, float acena ) { super ();
nazwa = anazwa;
cena = acena;
}
public String toString()
{ StringBuffer sb = new StringBuffer ();
sb.append (" nazwa : " );
sb.append ( nazwa );
sb.append (" cena : " );
sb.append ( Podaj_cene());
return sb.toString ();
}
public boolean equals ( Object pom)
{ TProdukt1 aTProdukt1=(TProdukt1)pom;
if ( aTProdukt1 == null ) return false;
boolean bStatus = true;
if ( this.Podaj_typ() != aTProdukt1.Podaj_typ() ) bStatus = false;
else if ( !nazwa.equals(aTProdukt1.nazwa)) bStatus = false;
else if (this.Podaj_cene()!=aTProdukt1.Podaj_cene()) bStatus = false;
return bStatus;
}
public int Podaj_typ () {return 0; }
public float Podaj_cene () { return cena+Czesc_brutto(); } public String Podaj_nazwe () { return nazwa;}
public void Nadaj_nazwe (String anazwa) { nazwa =anazwa;}
public float Czesc_brutto () { return 0; }
public void Wyswietl ()
{ System.out.println(toString()); }
}
import java.io.*;
import java.util.*;
public class TAplikacja implements Serializable
{
private Vector Produkty = new Vector();
private Vector Rachunki = new Vector();
public void Wstaw_zakup (int nr, int ile, TProdukt1 produkt1) { TRachunek pom;
TProdukt1 p;
if ((pom=Szukaj_rachunek(nr))!=null) if ((p=Szukaj_produkt(produkt1))!=null) pom.Dodaj_zakup(new TZakup(ile,p)); }
public TRachunek Szukaj_rachunek (int nr) { TRachunek pom;
Iterator it = Rachunki.iterator();
while (it.hasNext())
{ pom = (TRachunek)it.next();
if (pom.equals(nr)) return pom;}
return null; }
public float Podaj_wartosc (int nr) { TRachunek pom;
pom = Szukaj_rachunek(nr);
if (pom!=null)
return pom.Podaj_wartosc();
return 0;
}
public TProdukt1 Szukaj_produkt (TProdukt1 produkt) { TProdukt1 pom;
if (Produkty.contains(produkt))
{pom=(TProdukt1)Produkty.get((Produkty.indexOf(produkt)));
return pom;}
return null;
}
public void Dodaj_produkt (TProdukt1 pom) { if (Szukaj_produkt(pom)==null)
Produkty.add(pom);
}
public void Wstaw_rachunek (int nr) { TRachunek pom=new TRachunek(nr);
if (Szukaj_rachunek(nr)==null) Rachunki.add(pom);
}
public void Wyswietl() { TProdukt1 pom;
Iterator it = Produkty.iterator();
while (it.hasNext())
{ pom=(TProdukt1)it.next();
System.out.println(pom.toString()); } }
void Zapiszobiektydopliku() {
try
{ FileOutputStream plikobiektow = new FileOutputStream ("Wiadomosc1.obj");
ObjectOutputStream strumienobiektow =
new ObjectOutputStream (plikobiektow);
strumienobiektow.writeObject(this.Produkty);
strumienobiektow.close();
System.out.println("Obiekt Produkty zostal zapisany do pliku");
plikobiektow = new FileOutputStream ("Wiadomosc2.obj");
strumienobiektow = new ObjectOutputStream (plikobiektow);
strumienobiektow.writeObject(this.Rachunki);
strumienobiektow.close();
System.out.println("Obiekt Rachunki zostal zapisany do pliku");
} catch (IOException e)
{ System.out.println ("Blad zapisu pliku obiektowego"+e);}
}
TAplikacja Odczytajobiektyzpliku()
{ TAplikacja ap = new TAplikacja();
Vector produkty, rachunki;
try
{ FileInputStream plikobiektow = new FileInputStream ("Wiadomosc1.obj");
ObjectInputStream strumienobiektow =
new ObjectInputStream (plikobiektow);
produkty = (Vector)strumienobiektow.readObject();
System.out.println("Obiekt Produkty zostal odczytany z pliku");
strumienobiektow.close();
plikobiektow = new FileInputStream ("Wiadomosc2.obj");
strumienobiektow = new ObjectInputStream (plikobiektow);
rachunki = (Vector)strumienobiektow.readObject();
System.out.println("Obiekt Rachunki zostal odczytany z pliku");
strumienobiektow.close();
ap.Produkty=produkty;
ap.Rachunki=rachunki;
} catch (Exception e)
{ System.out.println ("Blad odczytu pliku obiektowego"+e);
return null; } return ap;
}
public static void main(String args[]) { TAplikacja app=new TAplikacja();
TProdukt1 p1=new TProdukt1("1",1);
app.Dodaj_produkt(p1);
TProdukt1 p2=new TProdukt1("2",2);
app.Dodaj_produkt(p2);
TProdukt1 p3=new TProdukt1("1",1);
app.Dodaj_produkt(p3);
TProdukt2 p4=new TProdukt2("1",1,22);
app.Dodaj_produkt(p4);
TProdukt2 p5=new TProdukt2("2",2,10);
app.Dodaj_produkt(p5);
TProdukt2 p6=new TProdukt2("1",1,22);
app.Dodaj_produkt(p6);
TProdukt3 p7=new TProdukt3("1",1,22);
app.Dodaj_produkt(p7);
TProdukt3 p8=new TProdukt3("2",2,10);
app.Dodaj_produkt(p8);
TProdukt3 p9=new TProdukt3("1",1,22);
app.Dodaj_produkt(p9);
System.out.println("\nProdukty\n");
app.Wyswietl();
app.Wstaw_rachunek(1);
app.Wstaw_rachunek(1);
app.Wstaw_rachunek(2);
app.Wstaw_zakup(1,1,new TProdukt1("1",1));
app.Wstaw_zakup(1,2,new TProdukt2("1",1,22));
app.Wstaw_zakup(1,1,new TProdukt3("1",1,22));
app.Wstaw_zakup(1,4,new TProdukt3("1",1,22));
app.Wstaw_zakup(1,1,new TProdukt2("2",1,22));
app.Wstaw_zakup(2,1,new TProdukt1("1",1));
app.Wstaw_zakup(2,2,new TProdukt2("1",1,22));
app.Wstaw_zakup(2,1,new TProdukt3("1",1,22));
app.Wstaw_zakup(2,4,new TProdukt3("1",1,22));
app.Wstaw_zakup(2,1,new TProdukt2("2",1,22));
TRachunek pom;
if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());
}
if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");
}
app.Zapiszobiektydopliku();
app=app.Odczytajobiektyzpliku();
if(app==null) return;
app.Wyswietl();
if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());
}
if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");
}
TProdukt1 p=new TProdukt1("1",1); //test powiązania if ((p=app.Szukaj_produkt(p))!=null)
{ p.Nadaj_nazwe ("11");
}
app.Wyswietl();
if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());
}
if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");
}
}
}
Przykład 2 – Serializacja aplikacji w dwóch strumieniach – utrata powiązań między danymi
import java.util.*;
import java.io.*;
public class TAplikacja implements Serializable { private Vector Tytuly = new Vector(2,3);
private Vector Ksiazki = new Vector(2,3);
public TAplikacja() { super(); }
public final Vector getTTytulVector () { return Tytuly ; }
public final Vector getTKsiazkaVector () { return Ksiazki; }
public final void removeTTytul (TTytul aTTytul) throws Exception { Tytuly.removeElement(aTTytul) ; }
public final void removeAllTTytul (TTytul aTTytul) throws Exception { Tytuly.removeAllElements() ;}
TTytul Szukaj (TTytul aTTytul) { Iterator iterator = Tytuly.iterator();
TTytul pom;
while (iterator.hasNext()) { pom=(TTytul)iterator.next();
if (pom.equals(aTTytul)) return pom;}
return null;
}
void Wstaw_tytul(String a, String b, String c) {//wyszukiwanie sekwencyjne z kolekcji TKol1 TTytul aTTytul = new TTytul(a,b,c,Ksiazki);
if (Szukaj(aTTytul)==null) Tytuly.add(aTTytul); } void Wyswietl_tytuly() {String s;
Iterator iterator = Tytuly.iterator();
while(iterator.hasNext())
{s=((TTytul)iterator.next()).toString();
System.out.println(s);}
}
void Zwieksz_zasob(String a, String b, String c, int numer) { TTytul aTTytul=new TTytul(a,b,c,Ksiazki);
if ((aTTytul=Szukaj(aTTytul))!=null) aTTytul.Wstaw_pozycje(numer);
else System.out.println("\nNie znaleziono ksiazki o tytule "+a);
}
void Wyswietl_ksiazki() {String s;
Iterator iterator = Ksiazki.iterator();
while(iterator.hasNext())
{s=((TKsiazka)iterator.next()).toString();
System.out.println(s); } }
void Zmien_tytul(String nnazwa, String nazwa, String autor, String ISBN ) { TTytul tytul, stytul= new TTytul(nazwa, autor, ISBN, Ksiazki);
Iterator iterator = Tytuly.iterator();
while(iterator.hasNext())
{ tytul=(TTytul)iterator.next();
if (tytul.equals(stytul))
{ tytul.setTytul(nnazwa); break; } }
}
void Zapiszobiektydopliku() { try
{ FileOutputStream plikobiektow = new FileOutputStream ("Wiadomosc1.obj");
ObjectOutputStream strumienobiektow =
new ObjectOutputStream (plikobiektow);
strumienobiektow.writeObject(this.Tytuly);
strumienobiektow.close();
System.out.println("Obiekt tytuly zostal zapisany do pliku");
plikobiektow = new FileOutputStream ("Wiadomosc2.obj");
strumienobiektow = new ObjectOutputStream (plikobiektow);
strumienobiektow.writeObject(this.Ksiazki);
strumienobiektow.close();
System.out.println("Obiekt ksiazki zostal zapisany do pliku");
}
catch (IOException e){ System.out.println ("Blad zapisu pliku obiektowego"+e);}
}
TAplikacja Odczytajobiektyzpliku() { TAplikacja ap = new TAplikacja();
Vector tytuly, ksiazki;
try
{ FileInputStream plikobiektow = new FileInputStream ("Wiadomosc1.obj");
ObjectInputStream strumienobiektow =
new ObjectInputStream (plikobiektow);
tytuly = (Vector)strumienobiektow.readObject();
System.out.println("Obiekt tytuly zostal odczytany z pliku");
strumienobiektow.close();
plikobiektow = new FileInputStream ("Wiadomosc2.obj");
strumienobiektow = new ObjectInputStream (plikobiektow);
ksiazki = (Vector)strumienobiektow.readObject();
System.out.println("Obiekt ksiazki zostal odczytany z pliku");
strumienobiektow.close();
ap.Tytuly=tytuly;
ap.Ksiazki=ksiazki;
} catch (Exception e)
{ System.out.println ("Blad odczytu pliku obiektowego"+e);
return null; }
return ap; } }
import java.io.*;
public class Program {
public static void main(String args[]) { TAplikacja aplikacja = new TAplikacja();
aplikacja.Wstaw_tytul("Tytul1","1","1");
aplikacja.Wstaw_tytul("Tytul4","4","4");
aplikacja.Wstaw_tytul("Tytul1","1","1");
aplikacja.Wstaw_tytul("Tytul3","3","3");
aplikacja.Wstaw_tytul("Tytul2","2","2");
aplikacja.Wyswietl_tytuly();
aplikacja.Zwieksz_zasob("Tytul1","1","1",1);
aplikacja.Zwieksz_zasob("Tytul2","2","2",2);
aplikacja.Zwieksz_zasob("Tytul3","3","3",3);
aplikacja.Zwieksz_zasob("Tytul4","4","4",4);
aplikacja.Zwieksz_zasob("Tytul1","1","1",5);
aplikacja.Wyswietl_ksiazki();
aplikacja.Zapiszobiektydopliku();
aplikacja=aplikacja.Odczytajobiektyzpliku();
aplikacja.Wyswietl_tytuly();
aplikacja.Wyswietl_ksiazki();
aplikacja.Zmien_tytul("11","Tytul1","1","1"); //test powiązania aplikacja.Wyswietl_tytuly();
aplikacja.Wyswietl_ksiazki();
}
}
Przykład 3 – Zapisywanie aplikacji w jednym strumieniu – zachowanie powiązań między danymi (patrz przykład 1)
import java.io.*;
import java.util.*;
public class TAplikacja implements Serializable { private Vector Produkty = new Vector();
private Vector Rachunki = new Vector();
public void Wstaw_zakup (int nr, int ile, TProdukt1 produkt1) { TRachunek pom;
TProdukt1 p;
if ((pom=Szukaj_rachunek(nr))!=null) if ((p=Szukaj_produkt(produkt1))!=null) pom.Dodaj_zakup(new TZakup(ile,p));
}
public TRachunek Szukaj_rachunek (int nr) { TRachunek pom;
Iterator it = Rachunki.iterator();
while (it.hasNext())
{ pom = (TRachunek)it.next();
if (pom.equals(nr)) return pom;}
return null;
}
public float Podaj_wartosc (int nr) { TRachunek pom;
pom = Szukaj_rachunek(nr);
if (pom!=null)
return pom.Podaj_wartosc();
return 0;
}
public TProdukt1 Szukaj_produkt (TProdukt1 produkt) { TProdukt1 pom;
if (Produkty.contains(produkt))
{pom=(TProdukt1)Produkty.get((Produkty.indexOf(produkt)));
return pom;}
return null;
}
public void Dodaj_produkt (TProdukt1 pom) { if (Szukaj_produkt(pom)==null)
Produkty.add(pom);
}
public void Wstaw_rachunek (int nr) { TRachunek pom=new TRachunek(nr);
if (Szukaj_rachunek(nr)==null) Rachunki.add(pom);
}
public void Wyswietl() { TProdukt1 pom;
Iterator it = Produkty.iterator();
while (it.hasNext())
{ pom=(TProdukt1)it.next();
System.out.println(pom.toString());
} }
void Zapiszobiektydopliku() { try
{ FileOutputStream plikobiektow = new FileOutputStream ("Wiadomosc.obj");
ObjectOutputStream strumienobiektow =
new ObjectOutputStream (plikobiektow);
strumienobiektow.writeObject(this);
strum ienobiektow.close();
System.out.println("Obiekt aplikacja zostal zapisany do pliku");
} catch (IOException e)
{ System.out.println ("Blad zapisu pliku obiektowego"+e);}
}
TAplikacja Odczytajobiektyzpliku() { TAplikacja ap;
try
{ FileInputStream plikobiektow = new FileInputStream ("Wiadomosc.obj");
ObjectInputStream strumienobiektow =
new ObjectInputStream (plikobiektow);
ap = (TAplikacja)strumienobiektow.readObject();
System.out.println("Obiekt aplikacja zostal odczytany z pliku");
strumienobiektow.close();
} catch (Exception e)
{ System.out.println ("Blad odczytu pliku obiektowego"+e);
return null; } return ap;
}
public static void main(String args[]) { TAplikacja app=new TAplikacja();
TProdukt1 p1=new TProdukt1("1",1);
app.Dodaj_produkt(p1);
TProdukt1 p2=new TProdukt1("2",2);
app.Dodaj_produkt(p2);
TProdukt1 p3=new TProdukt1("1",1);
app.Dodaj_produkt(p3);
TProdukt2 p4=new TProdukt2("1",1,22);
app.Dodaj_produkt(p4);
TProdukt2 p5=new TProdukt2("2",2,10);
app.Dodaj_produkt(p5);
TProdukt2 p6=new TProdukt2("1",1,22);
app.Dodaj_produkt(p6);
TProdukt3 p7=new TProdukt3("1",1,22);
app.Dodaj_produkt(p7);
TProdukt3 p8=new TProdukt3("2",2,10);
app.Dodaj_produkt(p8);
TProdukt3 p9=new TProdukt3("1",1,22);
app.Dodaj_produkt(p9);
System.out.println("\nProdukty\n");
app.Wyswietl();
app.Wstaw_rachunek(1);
app.Wstaw_rachunek(1);
app.Wstaw_rachunek(2);
app.Wstaw_zakup(1,1,new TProdukt1("1",1));
app.Wstaw_zakup(1,2,new TProdukt2("1",1,22));
app.Wstaw_zakup(1,1,new TProdukt3("1",1,22));
app.Wstaw_zakup(1,4,new TProdukt3("1",1,22));
app.Wstaw_zakup(1,1,new TProdukt2("2",1,22));
app.Wstaw_zakup(2,1,new TProdukt1("1",1));
app.Wstaw_zakup(2,2,new TProdukt2("1",1,22));
app.Wstaw_zakup(2,1,new TProdukt3("1",1,22));
app.Wstaw_zakup(2,4,new TProdukt3("1",1,22));
app.Wstaw_zakup(2,1,new TProdukt2("2",1,22));
TRachunek pom;
if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());
}
if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");
}
app.Zapiszobiektydopliku();
app=app.Odczytajobiektyzpliku();
if(app==null) return;
app.Wyswietl()
if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());
}
if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");
}
TProdukt1 p=new TProdukt1("1",1);
if ((p=app.Szukaj_produkt(p))!=null) //test powiązania { p.Nadaj_nazwe ("11"); }
app.Wyswietl();
if (( pom= app.Szukaj_rachunek(1))!=null) { System.out.println("\nRachunek 1\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc());
}
if (( pom= app.Szukaj_rachunek(2))!=null) { System.out.println("\nRachunek 2\n");
pom.Wyswietl();
System.out.println("Wartosc rachunku: "+pom.Podaj_wartosc()+"\n");
}
}
}
Przykład 4 – Zapisywanie aplikacji w jednym strumieniu – zachowanie powiązań między danymi (patrz przykład 2)
import java.util.*;
import java.io.*;
public class TAplikacja implements Serializable { private Vector Tytuly = new Vector(2,3);
private Vector Ksiazki = new Vector(2,3);
public TAplikacja() { super(); }
public final Vector getTTytulVector () { return Tytuly ;}
public final Vector getTKsiazkaVector () { return Ksiazki; }
public final void removeTTytul (TTytul aTTytul) throws Exception { Tytuly.removeElement(aTTytul) ; }
public final void removeAllTTytul (TTytul aTTytul) throws Exception { Tytuly.removeAllElements() ; }
TTytul Szukaj (TTytul aTTytul) { Iterator iterator = Tytuly.iterator();
TTytul pom;
while (iterator.hasNext()) {pom=(TTytul)iterator.next();
if (pom.equals(aTTytul)) return pom;}
return null;
}
void Wstaw_tytul(String a, String b, String c) {//wyszukiwanie sekwencyjne z kolekcji TKol1 TTytul aTTytul = new TTytul(a,b,c,Ksiazki);
if (Szukaj(aTTytul)==null) Tytuly.add(aTTytul);
}
void Wyswietl_tytuly() {String s;
Iterator iterator = Tytuly.iterator();
while(iterator.hasNext())
{s=((TTytul)iterator.next()).toString();
System.out.println(s);}
}
void Zwieksz_zasob(String a, String b, String c, int numer) { TTytul aTTytul=new TTytul(a,b,c,Ksiazki);
if ((aTTytul=Szukaj(aTTytul))!=null) aTTytul.Wstaw_pozycje(numer);
else System.out.println("\nNie znaleziono ksiazki o tytule "+a);
}
void Wyswietl_ksiazki() {String s;
Iterator iterator = Ksiazki.iterator();
while(iterator.hasNext())
{s=((TKsiazka)iterator.next()).toString();
System.out.println(s);
} }
void Zmien_tytul(String nnazwa, String nazwa, String autor, String ISBN ) {TTytul tytul,stytul= new TTytul(nazwa, autor, ISBN, Ksiazki);
Iterator iterator = Tytuly.iterator();
while(iterator.hasNext()) { tytul=(TTytul)iterator.next();
if (tytul.equals(stytul)) { tytul.setTytul(nnazwa);
break; } }
}