według Wikipedii serializacja (lub serializacja) jest procesem tłumaczenia struktur danych lub stanu obiektu na format, który może być przechowywany (na przykład w pliku lub buforze pamięci) lub przesyłany (na przykład przez łącze sieciowe) i rekonstruowany później (prawdopodobnie w innym środowisku komputerowym).Gdy wynikowa seria bitów jest ponownie odczytywana zgodnie z formatem serializacji, może być używana do utworzenia semantycznie identycznego klonu oryginalnego obiektu.,
tak więc zasadniczo serializacja jest procesem przekształcania obiektu w sekwencję bajtów, które mogą być przechowywane na dysku lub bazie danych lub mogą być wysyłane przez strumienie. Odwrotny proces tworzenia obiektu z sekwencji bajtów nazywa się deserializacją.
serializacja i Deserializacja w Javie
aby serializować i deserializować nasz obiekt do pliku, musimy wywołaćObjectOutputStream.writeObject()
IObjectInputStream.readObject()
.,
klasa musi zaimplementować interfejs Serializowalny obecny w pakieciejava.io
, aby pomyślnie serializować swój obiekt. Serializable jest interfejsem znaczników, który dodaje zachowanie serializowalne do implementującej je klasy.
Java dostarcza Serializowalne API zamknięte w java.io
pakiet do serializacji i deserializacji obiektów, które obejmują
java.io.serializable
java.io.Externalizable
ObjectInputStream
- i
ObjectOutputStream
itd.,
=”446a777f4d”>
punkty do zapamiętania
1. Jeśli Klasa macierzysta ma zaimplementowany interfejs Serializowalny, Klasa potomna nie musi go implementować, ale odwrotnie nie jest prawdą.
2 . Tylko niestatyczne elementy danych są zapisywane w procesie serializacji.
3. Statyczne elementy danych i przejściowe elementy danych nie są zapisywane przez serializację process.So, jeśli nie chcesz zapisywać wartości niestatycznego elementu danych, zrób to jako transient.
4., Konstruktor obiektu nigdy nie jest wywoływany, gdy obiekt jest deserializowany.
5. Powiązane obiekty muszą implementować interfejs Serializowalny.
SerialVersionUID
środowisko uruchomieniowe Serialization kojarzy numer wersji z każdą klasą Serializowalną o nazwie SerialVersionUID, która jest używana podczas deserializacji do sprawdzenia, czy nadawca i odbiorca serializowanego obiektu mają załadowane klasy dla tego obiektu, które są zgodne z serializacją., Jeśli odbiorca załadował klasę dla obiektu, który ma inny UID niż odpowiedni UID klasy nadawcy, Deserializacja spowoduje wystąpienie InvalidClassException. Klasa Serializowalna może zadeklarować swój własny UID jawnie deklarując nazwę pola.
musi być statyczny, końcowy i typu long.
i.,e-any-ACCESS-MODIFIER static final long serialVersionUID=42L;
Jeśli Klasa serializowalna nie deklaruje jawnie identyfikatora serialVersionUID, to środowisko uruchomieniowe serializacji obliczy domyślną dla tej klasy na podstawie różnych aspektów klasy, jak opisano w specyfikacji Java Object Serialization. Jednak zaleca się, aby wszystkie klasy serializowalne jawnie deklarowały wartość serialVersionUID, ponieważ jej obliczenia są bardzo wrażliwe na szczegóły klasy, które mogą się różnić w zależności od implementacji kompilatora, każda zmiana w klasie lub użycie innego id może mieć wpływ na dane serializowane.,
zaleca się również użycie modyfikatora prywatnego dla UID, ponieważ nie jest on użyteczny jako dziedziczony członek.
w przypadku zmiennych przejściowych:- zmienna zdefiniowana słowem kluczowym transient nie jest serializowana podczas procesu serializacji.Ta zmienna zostanie zainicjowana wartością domyślną podczas deserializacji. (np.: dla obiektów jest null, dla int jest 0).
W przypadku zmiennych statycznych: – zmienna zdefiniowana słowem kluczowym statyczny nie jest serializowana podczas procesu serializacji.Ta zmienna zostanie załadowana z bieżącą wartością zdefiniowaną w klasie podczas deserializacji.,
serializacja w Javie
Deserializacja
pole kontaktu jest null,ponieważ zostało oznaczone jako statyczne i jak już wcześniej omówiliśmy, pola statyczne nie są serializowane.
Uwaga: statyczne elementy nigdy nie są serializowane, ponieważ są połączone z klasą, A nie obiektem klasy.
- serializacja jest procesem zapisywania stanu obiektu do sekwencji bajtów, które następnie mogą być przechowywane w pliku lub wysyłane przez sieć, a deserializacja jest procesem rekonstrukcji obiektu z tych bajtów.,
- tylko podklasy interfejsu
Serializable
mogą być serializowane. - Jeśli nasza klasa nie zaimplementuje
Serializable
interfejsu lub jeśli ma odniesienie do innej klasySerializable
, to JVM wyrzuciNotSerializableException
. - wszystkie
transient
Istatic
pola nie są serializowane. -
serialVersionUID
jest używany do sprawdzania, czy serializowane i deserializowane obiekty mają te same atrybuty i dlatego są zgodne z deserializacją., - powinniśmy utworzyć
serialVersionUID
pole w naszej klasie, więc jeśli zmienimy strukturę naszej klasy (dodawanie/usuwanie pól) JVM nie będzie przezInvalidClassException
. Jeśli go nie podamy, JVM dostarczy taki, który może się zmienić, gdy zmieni się struktura naszej klasy. - możemy nadpisać domyślne zachowanie serializacji wewnątrz naszej klasy Java, dostarczając implementację metod
writeObject
IreadObject
., - i możemy wywołać
ObjectOutputStream.defaultWriteObject()
IObjectInputStream.defaultReadObject
zwriteObject
IreadObject
metody, aby uzyskać domyślną logikę serializacji i deserializacji. - możemy wyrzucić
NotSerializableException
wyjątek zwriteObject
IreadObject
, jeśli nie chcemy, aby nasza klasa była serializowana lub deserializowana.
Leave a Reply