[ Pobierz całość w formacie PDF ]

}
}
}
class Employee implements Serializable
{
public Employee()
{
}
public Employee(String n, double s, int year, int month, int day)
{
name = n;
salary = s;
GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
hireDay = calendar.getTime();
}
public String getName()
{
60 Java. Techniki zaawansowane
return name;
}
public double getSalary()
{
return salary;
}
public Date getHireDay()
{
return hireDay;
}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
public String toString()
{
return getClass().getName() + "[name=" + name + ",salary=" + salary +
",hireDay=" + hireDay
+ "]";
}
private String name;
private double salary;
private Date hireDay;
}
class Manager extends Employee
{
/**
* Tworzy obiekt klasy Manager nie inicjuj c pola secretary
* @param n nazwisko pracownika
* @param s wynagrodzenie
* @param year rok zatrudnienia
* @param month miesi c zatrudnienia
* @param day dzie zatrudnienia
*/
public Manager(String n, double s, int year, int month, int day)
{
super(n, s, year, month, day);
secretary = null;
}
/**
* Przypisuje asystenta mened erowi.
* @param s asystent
*/
public void setSecretary(Employee s)
{
secretary = s;
}

Rozdzia 1. Strumienie i pliki 61
public String toString()
{
return super.toString() + "[secretary=" + secretary + "]";
}
private Employee secretary;
}
java.io.ObjectOutputStream 1.1
ObjectOutputStream(OutputStream wy)
tworzy obiekt ObjectOutputStream, dzi ki któremu mo esz zapisywa obiekty
do podanego strumienia wyj cia.
void writeObject(Object ob)
zapisuje podany obiekt do ObjectOutputStream. Metoda ta zachowuje klas
obiektu, sygnatur klasy oraz warto ci wszystkich niestatycznych,
nieprzechodnich pól sk adowych tej klasy, a tak e jej nadklas.
java.io.ObjectInputStream 1.1
ObjectInputStream(InputStream we)
tworzy obiekt ObjectInputStream, dzi ki któremu mo esz odczytywa informacje
z podanego strumienia wej cia.
Object readObject()
wczytuje obiekt z ObjectInputStream. Pobiera klas obiektu, sygnatur klasy oraz
warto ci wszystkich niestatycznych, nieprzechodnich pól sk adowych tej klasy,
a tak e jej nadklas. Przeprowadza deserializacj , pozwalaj c na przyporz dkowanie
obiektów referencjom.
Format pliku serializacji obiektów
Serializacja obiektów powoduje zapisanie danych obiektu w okre lonym formacie. Oczy-
wi cie, mo emy u ywa metod writeObject/readObject, nie wiedz c nawet, która sekwencja
bajtów reprezentuje dany obiekt w pliku. Niemniej jednak doszli my do wniosku, e poznanie
formatu danych b dzie bardzo pomocne, poniewa daje wgl d w proces obs ugi obiektów
przez strumienie. Poniewa poni szy tekst jest pe en technicznych detali, to je li nie jeste
zainteresowany implementacj serializacji, mo esz pomin lektur tego podrozdzia u.
Ka dy plik zaczyna si dwubajtow  magiczn liczb  :
AC ED
po której nast puje numer wersji formatu serializacji obiektów, którym aktualnie jest
00 05
(w tym podrozdziale do opisywania bajtów b dziemy u ywa notacji szesnastkowej). Pó niej
nast puje sekwencja obiektów, w takiej kolejno ci, w jakiej zosta y one zapisane.
62 Java. Techniki zaawansowane
a cuchy zapisywane s jako
74 d ugo (2 bajty) znaki
Dla przyk adu, a cuch "Harry" b dzie wygl da tak:
74 00 05 Harry
Znaki Unicode zapisywane s w zmodyfikowanym formacie UTF-8.
Wraz z obiektem musi zosta zapisana jego klasa. Opis klasy zawiera:
nazw klasy,
unikalny numer ID stanowi cy  odcisk wszystkich danych sk adowych
i sygnatur metod,
zbiór flag opisuj cy metod serializacji,
opis pól sk adowych.
Java tworzy wspomniany  odcisk klasy, pobieraj c opisy klasy, klasy bazowej, interfejsów,
typów pól danych oraz sygnatury metod w postaci kanonicznej, a nast pnie stosuje do nich
algorytm SHA (Secure Hash Algorithm).
SHA to szybki algorytm, tworz cy  odciski palców dla du ych bloków danych. Niezale nie
od rozmiaru oryginalnych danych,  odciskiem jest zawsze pakiet 20 bajtów. Jest on two-
rzony za pomoc sekwencji operacji binarnych, dzi ki którym mo emy mie stuprocentow
pewno , e je eli zachowana informacja zmieni si , zmianie ulegnie równie jej  odcisk
palca . SHA jest ameryka skim standardem, rekomendowanym przez Narodowy Instytut Nauki
i Technologii (National Institute of Science and Technology  NIST; aby dowiedzie si
wi cej o SHA, zajrzyj np. do Cryptography and Network Security: Principle and Practice,
autorstwa Williama Stallingsa, wydanej przez Prentice Hall). Jednak e Java korzysta jedynie
z pierwszych o miu bajtów kodu SHA. Mimo to nadal jest bardzo prawdopodobne, e  odcisk
zmieni si , je eli ulegn zmianie pola sk adowe lub metody.
W chwili odczytu danych Java sprawdza, u ywaj c  odcisku klasy, czy definicja klasy nie
uleg a zmianie. Oczywi cie, w praktyce klasy ulegaj zmianie i mo e si okaza , e program
b dzie musia wczyta starsze wersje obiektów. Zagadnienie to omówimy w punkcie  Wersje
na stronie 71.
Oto, w jaki sposób przechowywany jest identyfikator klasy:
72
d ugo nazwy klasy (2 bajty)
nazwa klasy
 odcisk klasy (8 bajtów)
zbiór flag (1 bajt)
liczba deskryptorów pól sk adowych (2 bajty)
deskryptory pól sk adowych

Rozdzia 1. Strumienie i pliki 63
78 (znacznik ko ca)
typ klasy bazowej (70, je li nie istnieje)
Bajt flag sk ada si z trzybitowych masek, zdefiniowanych w java.io.ObjectStreamCon
stants:
java.io.ObjectStreamConstants:
static final byte SC_WRITE_METHOD = 1;
// klasa posiada metod writeObject zapisuj c dodatkowe dane
static final byte SC_SERIALIZABLE = 2;
// klasa implementuje interfejs Serializable
static final byte SC_EXTERNALIZABLE = 4;
// klasa implementuje interfejs Externalizable
Interfejs Externalizable omówimy w dalszej cz ci rozdzia u. Klasy implementuj ce Exter
nalizable udost pniaj w asne metody wczytuj ce i zapisuj ce, które przejmuj obs ug [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • blogostan.opx.pl