wprowadzenie

serializacja jest konwersją stanu obiektu do strumienia bajtów; deserializacja robi odwrotnie. Serializacja to przekształcenie obiektu Java w statyczny strumień (sekwencję) bajtów, który może być następnie zapisany w bazie danych lub przesłany przez sieć.

serializacja i Deserializacja

proces serializacji jest niezależny od instancji, tzn., obiekty mogą być serializowane na jednej platformie i deserializowane na innej. Klasy kwalifikujące się do serializacji muszą zaimplementować specjalny interfejs znacznika Serializowalny.

zarówno ObjectInputStream, jak i ObjectOutputStream są klasami wysokiego poziomu, które rozszerzają odpowiednio java.io.InputStream i java.io.OutputStream. ObjectOutputStream może zapisywać prymitywne typy i wykresy obiektów do strumienia wyjściowego jako strumień bajtów. Strumienie te mogą być następnie odczytywane za pomocą ObjectInputStream.,

najważniejszą metodą w ObjectOutputStream jest:

public final void writeObject(Object o) throws IOException;

która pobiera obiekt serializowalny i konwertuje go do sekwencji (strumienia) bajtów. Podobnie, najważniejszą metodą w ObjectInputStream jest:

public final Object readObject() throws IOException, ClassNotFoundException;

która może odczytać strumień bajtów i przekształcić go z powrotem w obiekt Java. Następnie można go oddać z powrotem do pierwotnego obiektu.

zilustrujmy serializację klasą Person. Zauważ, że statyczne pola należą do klasy (w przeciwieństwie do obiektu) i nie są serializowane., Zauważ również, że możemy użyć słowa kluczowego transient do ignorowania pól klasy podczas serializacji:

public class Person implements Serializable { private static final long serialVersionUID = 1L; static String country = "ITALY"; private int age; private String name; transient int height; // getters and setters}

poniższy test pokazuje przykład zapisania obiektu typu Person do pliku lokalnego, a następnie odczytania tej wartości z powrotem:

do zapisania stanu tego obiektu do pliku za pomocą FileOutputStream użyliśmy ObjectOutputStream. Plik ” yourfile.txt ” jest tworzony w katalogu projektu. Ten plik jest następnie ładowany za pomocą FileInputStream. ObjectInputStream pobiera ten strumień i przekształca go w nowy obiekt o nazwie p2.,

na koniec testujemy stan załadowanego obiektu i odpowiada on stanowi oryginalnego obiektu.

zauważ, że załadowany obiekt musi być jawnie oddany do typu Person.

zastrzeżenia dotyczące serializacji w Javie

istnieją pewne zastrzeżenia dotyczące serializacji w Javie.

3.1. Dziedziczenie i skład

gdy klasa implementuje interfejs java.io.Serializable, wszystkie jej podklasy są również serializowalne., Przeciwnie, gdy obiekt ma odniesienie do innego obiektu, obiekty te muszą zaimplementować interfejs Serializowalny oddzielnie, w przeciwnym razie zostanie rzucona wyjątek NotSerializableException:

public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}

Jeśli jedno z pól w obiekcie serializowalnym składa się z tablicy obiektów, wtedy wszystkie te obiekty muszą być również serializowalne, w przeciwnym razie zostanie rzucona wyjątek NotSerializableException.

3.2. UID wersji szeregowej

JVM kojarzy numer wersji (long) z każdą klasą serializowalną., Służy do sprawdzenia, czy zapisane i załadowane obiekty mają te same atrybuty, a tym samym są zgodne w serializacji.

liczba ta może być generowana automatycznie przez większość IDE i jest oparta na nazwie klasy, jej atrybutach i powiązanych modyfikatorach dostępu. Wszelkie zmiany skutkują inną liczbą i mogą spowodować wyjątek InvalidClassException.

Jeśli Klasa serializowalna nie deklaruje identyfikatora serialVersionUID, JVM wygeneruje go automatycznie w czasie wykonywania., Jest jednak wysoce zalecane, aby każda klasa deklarowała swój identyfikator serialVersionUID, ponieważ generowany jest zależny od kompilatora i dlatego może spowodować nieoczekiwane InvalidClassExceptions.

3.3. Niestandardowa serializacja w Javie

Java określa domyślny sposób serializacji obiektów. Klasy Java mogą nadpisać to domyślne zachowanie. Niestandardowa serializacja może być szczególnie przydatna podczas próby serializacji obiektu, który ma pewne nieuserializowane atrybuty., Można to zrobić poprzez podanie dwóch metod wewnątrz klasy, które chcemy serializować:

private void writeObject(ObjectOutputStream out) throws IOException;

i

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

za pomocą tych metod możemy serializować te nieserializowalne atrybuty do innych form, które mogą być serializowane:

public class Address { private int houseNumber; // setters and getters}

poniższy test jednostkowy testuje tę niestandardową serializację:

w tym kodzie widzimy, jak zapisać niektóre nieserializowalne atrybuty przez serializowanie adresu za pomocą niestandardowej serializacji. Zauważ, że musimy oznaczyć atrybuty unserializable jako przejściowe, aby uniknąć wyjątku NotSerializableException.,

podsumowanie

w tym krótkim samouczku sprawdziliśmy serializację Javy, omówiliśmy ważne rzeczy, o których należy pamiętać i pokazaliśmy, jak zrobić niestandardową serializację.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *