Co należy rozumieć przez „serializację obiektów”? Czy możesz wyjaśnić to kilkoma przykładami?
java
serialization
object-serialization
Wojownik
źródło
źródło
Odpowiedzi:
Serializacja to konwersja obiektu na szereg bajtów, dzięki czemu obiekt można łatwo zapisać w pamięci trwałej lub przesłać strumieniowo przez łącze komunikacyjne. Strumień bajtów można następnie przekształcić z postaci szeregowej - przekonwertować na replikę oryginalnego obiektu.
źródło
Serializację można traktować jako proces przekształcania instancji obiektu w sekwencję bajtów (która może być binarna lub nie w zależności od implementacji).
Jest to bardzo przydatne, gdy chcesz przesłać dane jednego obiektu przez sieć, na przykład z jednej maszyny JVM do drugiej.
W Javie mechanizm serializacji jest wbudowany w platformę, ale musisz zaimplementować interfejs Serializable , aby obiekt mógł zostać serializowany.
Można również zapobiec szeregowaniu niektórych danych w obiekcie, zaznaczając atrybut jako przejściowy .
Wreszcie możesz zastąpić domyślny mechanizm i podać własny; może to być odpowiednie w niektórych szczególnych przypadkach. Aby to zrobić, użyj jednej z ukrytych funkcji w Javie .
Należy zauważyć, że serializowane są „wartości” obiektu lub zawartości, a nie definicja klasy. Zatem metody nie są serializowane.
Oto bardzo podstawowa próbka z komentarzami ułatwiającymi jej czytanie:
Po uruchomieniu tego programu tworzony jest plik „o.ser” i możemy zobaczyć, co się stało.
Jeśli zmienimy wartość: someInteger na, na przykład Integer.MAX_VALUE , możemy porównać dane wyjściowe, aby zobaczyć, jaka jest różnica.
Oto zrzut ekranu pokazujący dokładnie tę różnicę:
Czy dostrzegasz różnice? ;)
W serializacji Java jest dodatkowe istotne pole: serialversionUID, ale myślę, że jest to już za długo, aby je objąć.
źródło
SerializationSample
SerializationSample instance = new SerializationSample();
następnie tworzony jest wynik, a obiekt zapisywany na tym wyjściu.Odważę się odpowiedzieć na 6-letnie pytanie, dodając tylko bardzo wysokiego poziomu zrozumienia dla osób, które nie znały Javy
Konwertowanie obiektu na bajty
Konwertowanie bajtów z powrotem na obiekt (deserializacja).
Kiedy chcemy przetrwać w obiekcie. Gdy chcemy, aby obiekt istniał poza okresem istnienia JVM.
Bankomat: gdy właściciel konta próbuje wypłacić pieniądze z serwera za pośrednictwem bankomatu, informacje o posiadaczu rachunku, takie jak dane dotyczące wypłaty, zostaną przekształcone do postaci szeregowej i wysłane do serwera, na którym dane te są deserializowane i wykorzystywane do wykonywania operacji.
Implementuj
java.io.Serializable
interfejs (interfejs znacznika, więc nie ma metody implementacji).Utrwal obiekt: użyj
java.io.ObjectOutputStream
klasy, strumienia filtru, który jest opakowaniem wokół strumienia bajtów niższego poziomu (aby zapisać obiekt do systemów plików lub przenieść spłaszczony obiekt przez przewód sieciowy i odbudowany po drugiej stronie).writeObject(<<instance>>)
- napisać obiektreadObject()
- odczytać zserializowany obiektPodczas szeregowania obiektu zapisywany jest tylko stan obiektu, a nie plik klasy obiektu lub metody.
Podczas serializacji obiektu 2-bajtowego widzisz 51-bajtowy plik serializowany.
Odpowiedź na: Jak przekonwertowano go na plik 51 bajtów?
java.lang.Object
.Edycja : jeszcze jeden dobry link do przeczytania.
Pozwoli to odpowiedzieć na kilka często zadawanych pytań:
Jak nie serializować żadnego pola w klasie.
Odp .: użyj przejściowego słowa kluczowego
Kiedy serializowana jest klasa podrzędna, czy klasa nadrzędna jest serializowana?
Odp .: Nie, jeśli rodzic nie rozszerza pola nadającego się do interfejsu szeregowego, rodzice nie podlegają serializacji.
Kiedy serializowany jest rodzic, czy klasa potomna jest serializowana?
Odp .: Tak, domyślnie serializowana jest również klasa podrzędna.
Jak uniknąć serializacji klasy dziecięcej?
Odp .: a. Przesłoń metodę writeObject i readObject i wyrzuć
NotSerializableException
.b. możesz także oznaczyć wszystkie pola jako przejściowe w klasie potomnej.
źródło
Serializacja polega na pobraniu „aktywnego” obiektu z pamięci i przekształceniu go do formatu, który może być gdzieś zapisany (np. W pamięci, na dysku), a później „zdezrializowany” z powrotem na obiekt aktywny.
źródło
Podobał mi się sposób, w jaki prezentuje @OscarRyz. Chociaż tutaj kontynuuję historię serializacji, która została pierwotnie napisana przez @amitgupta.
Mimo że wiedza na temat struktury klas robotów i szeregowanie danych naukowcy Ziemi nie byli w stanie dokonać deserializacji danych, które mogą sprawić, że roboty będą działać.
Naukowcy Marsa czekali na pełną płatność. Po dokonaniu płatności naukowcy Marsa udostępnili serialversionUID naukowcom z Ziemi. Naukowiec Ziemi ustawił go na klasę robotów i wszystko stało się dobrze.
źródło
Serializacja oznacza utrwalanie obiektów w Javie. Jeśli chcesz zapisać stan obiektu i chcesz go później odbudować (może być w innym JVM), możesz zastosować serializację.
Pamiętaj, że właściwości obiektu zostaną zapisane. Jeśli chcesz ponownie wskrzesić obiekt, powinieneś mieć plik klasy, ponieważ tylko zmienne składowe zostaną zapisane, a nie funkcje składowe.
na przykład:
Searializable to interfejs znaczników, który oznacza, że twoja klasa jest serializowalna. Interfejs znaczników oznacza, że jest to po prostu pusty interfejs i użycie tego interfejsu powiadomi JVM, że ta klasa może zostać przekształcona do postaci szeregowej.
źródło
Moje dwa centy z mojego bloga:
Oto szczegółowe wyjaśnienie serializacji : (mój własny blog)
Serializacja:
Serializacja to proces utrwalania stanu obiektu. Jest reprezentowany i przechowywany w postaci sekwencji bajtów. Można to zapisać w pliku. Proces odczytu stanu obiektu z pliku i przywracania go nazywa się deserializacją.
Jaka jest potrzeba serializacji?
We współczesnej architekturze zawsze istnieje potrzeba przechowywania stanu obiektu, a następnie jego odzyskiwania. Na przykład w Hibernacji, aby przechowywać obiekt, należy uczynić klasę Serializowalną. Po zapisaniu stanu obiektu w postaci bajtów można go przenieść do innego systemu, który może następnie odczytać stan i pobrać klasę. Stan obiektu może pochodzić z bazy danych lub innego środowiska JVM lub z oddzielnego komponentu. Za pomocą serializacji możemy odzyskać stan obiektu.
Przykład kodu i objaśnienie:
Najpierw spójrzmy na klasę przedmiotów:
W powyższym kodzie widać, że klasa Item implementuje Serializable .
Jest to interfejs, który umożliwia serializację klasy.
Teraz widzimy, że zmienna o nazwie serialVersionUID jest inicjowana na zmienną Long. Liczba ta jest obliczana przez kompilator na podstawie stanu klasy i atrybutów klasy. Jest to liczba, która pomoże jvm zidentyfikować stan obiektu podczas odczytu stanu obiektu z pliku.
W tym celu możemy zapoznać się z oficjalną dokumentacją Oracle:
Jeśli zauważyłeś, że użyliśmy innego słowa kluczowego, które jest przejściowe .
Jeśli pola nie można przekształcić do postaci szeregowej, należy je oznaczyć jako przejściowe. Tutaj zaznaczyliśmy itemCostPrice jako przejściowy i nie chcemy, aby był zapisany w pliku
Teraz przyjrzyjmy się, jak zapisać stan obiektu w pliku, a następnie odczytać go stamtąd.
Powyżej widzimy przykład serializacji i deserializacji obiektu.
Do tego wykorzystaliśmy dwie klasy. Do serializacji obiektu użyliśmy ObjectOutputStream. Użyliśmy metody writeObject, aby zapisać obiekt w pliku.
Do deserializacji użyliśmy ObjectInputStream, który czyta obiekt z pliku. Używa readObject do odczytu danych obiektu z pliku.
Wyjście powyższego kodu wyglądałoby następująco:
Zauważ, że itemCostPrice z zdezrializowanego obiektu ma wartość NULL ponieważ nie został zapisany.
Omówiliśmy już podstawy serializacji Java w części I tego artykułu.
Teraz omówmy to głęboko i jak to działa.
Najpierw zacznijmy od serialversionuid.
SerialVersionUID służy jako kontrola wersji w postaci szeregowej klasie.
Jeśli jawnie nie zadeklarujesz serialVersionUID, JVM zrobi to za ciebie automatycznie, w oparciu o różne właściwości klasy Serializable.
Algorytm Java obliczania serialversionuid (Przeczytaj więcej szczegółów tutaj)
Algorytm serializacji Java
O czym należy pamiętać:
Pola statyczne w klasie nie mogą być serializowane.
Jeśli serialversionuid jest inny w klasie read, wygeneruje
InvalidClassException
wyjątek.Jeśli klasa implementuje szeregowalny, wszystkie jego podklasy również będą szeregowalne.
Jeśli klasa ma odwołanie do innej klasy, wszystkie odniesienia muszą być możliwe do serializacji, w przeciwnym razie proces serializacji nie zostanie wykonany. W takim przypadku NotSerializableException jest generowany w czasie wykonywania.
Na przykład:
źródło
serialVersionUID
jest inaczej, rzuci anInvalidClassException
, a nie aClassCastException
. Nie trzeba marnować całego miejsca naserialVersionUID
obliczenia. Dokumentacja jest cytowana w nadmiernej długości, ale nie jest powiązana ani właściwie cytowana. Tutaj jest za dużo puchu i za dużo błędów.Serializacja to proces przekształcania stanu obiektu na bity, aby można go było zapisać na dysku twardym. Kiedy deserializujesz ten sam obiekt, zachowa on swój stan później. Umożliwia odtwarzanie obiektów bez konieczności ręcznego zapisywania właściwości obiektów.
http://en.wikipedia.org/wiki/Serialization
źródło
Serializacja obiektów Java
Serialization
jest mechanizmem przekształcającym wykres obiektów Java w tablicę bajtów do przechowywania (to disk file
) lub transmisji (across a network
), a następnie za pomocą deserializacji możemy przywrócić wykres obiektów. Wykresy obiektów są przywracane poprawnie za pomocą mechanizmu udostępniania referencji. Ale przed zapisaniem sprawdź, czy serialVersionUID z pliku wejściowego / sieci i pliku .class serialVersionUID są takie same. Jeśli nie, rzućjava.io.InvalidClassException
.serialVersionUID jest niezbędny w procesie serializacji. Ale programista może opcjonalnie dodać go do pliku źródłowego Java. Jeśli serialVersionUID nie zostanie uwzględniony, środowisko wykonawcze serializacji wygeneruje serialVersionUID i powiąże go z klasą. Zserializowany obiekt będzie zawierał ten serialVersionUID wraz z innymi danymi.
Uwaga - Zdecydowanie zaleca się, aby wszystkie klasy szeregowalne jawnie deklarowały serialVersionUID
since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations
, a zatem mogą powodować nieoczekiwane konflikty serialVersionUID podczas deserializacji, powodując niepowodzenie deserializacji.Sprawdzanie klas możliwych do serializacji
Klasa musi zaimplementować interfejs java.io.Serializable , aby pomyślnie serializować swój obiekt. Serializable jest interfejsem znaczników i służy do informowania kompilatora, że klasa implementująca go musi zostać dodana do postaci szeregowej. W tym przypadku Java Virtual Machine (JVM) odpowiada za automatyczną serializację.
Implementacja interfejsu zewnętrznego umożliwia obiektowi przejęcie pełnej kontroli nad zawartością i formatem postaci szeregowej obiektu. Metody interfejsu zewnętrznego, writeExternal i readExternal, są wywoływane w celu zapisania i przywrócenia stanu obiektów. Po zaimplementowaniu przez klasę mogą zapisywać i odczytywać swój własny stan przy użyciu wszystkich metod ObjectOutput i ObjectInput. Obiekt jest odpowiedzialny za obsługę wszelkich występujących wersji.
Tylko obiekty obsługujące interfejs java.io.Serializable lub java.io.Externalizable mogą być
written to
/read from
streamami. Klasa każdego obiektu możliwego do serializacji jest kodowana, w tym nazwa klasy i podpis klasy, wartości pól i tablic obiektu oraz zamknięcie wszelkich innych obiektów, do których odwołuje się obiekt początkowy.Serializowalny przykład plików
Przykład szeregowalny przez sieć
Rozkład stanu obiektu na różne przestrzenie adresowe, albo w różnych procesach na tym samym komputerze, albo nawet na wielu komputerach połączonych przez sieć, ale które współpracują ze sobą poprzez współdzielenie danych i wywoływanie metod.
@widzieć
źródło
JVM to JVM
Serializacja to proces zapisywania obiektu na nośniku pamięci (takim jak plik lub bufor pamięci) lub przesyłania go przez połączenie sieciowe w formie binarnej. Serializowane obiekty są niezależne od JVM i mogą być ponownie serializowane przez dowolną JVM. W tym przypadku stan obiektów Java w pamięci jest konwertowany na strumień bajtów. Ten typ pliku nie może być zrozumiany przez użytkownika. Jest to specjalny typ obiektu, tj. Ponownie wykorzystywany przez JVM (Java Virtual Machine). Ten proces serializacji obiektu nazywa się również deflacją lub zestawieniem obiektu.
Obiekt, który ma być serializowany, musi implementować
java.io.Serializable
interfejs. Domyślny mechanizm serializacji dla obiektu zapisuje klasę obiektu, sygnaturę klasy oraz wartości wszystkich pól nieprzemijających i niestatycznych.ObjectOutput
interfejs rozszerzaDataOutput
interfejs i dodaje metody serializacji obiektów i zapisywania bajtów do pliku.ObjectOutputStream
Rozszerzajava.io.OutputStream
i narzędziaObjectOutput
interfejsu. Serializuje obiekty, tablice i inne wartości do strumienia. Tak więc konstruktorObjectOutputStream
jest zapisany jako:Powyższy kod został użyty do utworzenia instancji
ObjectOutput
klasy za pomocąObjectOutputStream( )
konstruktora, który przejmuje instancję klasyFileOuputStream
jako parametr.ObjectOutput
Interfejs jest używany przez wdrożenieObjectOutputStream
klasę. TheObjectOutputStream
Jest wykonana serializacji obiektu.Deserializowanie obiektu w java
Odwrotna operacja serializacji nazywa się deserializacją, tzn. Ekstrakcja danych z szeregu bajtów jest znana jako deserializacja, która jest również nazywana nadmuchiwaniem lub rozróżnianiem.
ObjectInputStream
rozszerzajava.io.InputStream
i implementujeObjectInput
interfejs. Deserializuje obiekty, tablice i inne wartości ze strumienia wejściowego. Tak więc konstruktorObjectInputStream
jest zapisany jako:Powyższy kod programu tworzy instancję
ObjectInputStream
klasy w celu deserializacji tego pliku, który został zserializowany przezObjectInputStream
klasę. Powyższy kod tworzy instancję za pomocą instancjiFileInputStream
klasy, która przechowuje określony obiekt pliku, który należy zdekrirializować, ponieważObjectInputStream()
konstruktor potrzebuje strumienia wejściowego.źródło
Serializacja to proces przekształcania obiektu Java w tablicę bajtów, a następnie z powrotem w obiekt z zachowanym stanem. Przydatny do różnych rzeczy, takich jak wysyłanie obiektów przez sieć lub buforowanie rzeczy na dysk.
Przeczytaj więcej z tego krótkiego artykułu, który dość dobrze wyjaśnia programowanie tego procesu, a następnie przejdź do javadoc z Serializable . Możesz być także zainteresowany przeczytaniem tego powiązanego pytania .
źródło
Zwróć plik jako obiekt: http://www.tutorialspoint.com/java/java_serialization.htm
źródło
| * | Serializacja klasy: Konwersja obiektu na bajty i bajty z powrotem na obiekt (deserializacja).
| => Serializacja obiektu to proces przekształcania stanu obiektu w parę bajtów.
| => Deserializacja obiektu to proces uzyskiwania stanu obiektu i przechowywania go w obiekcie (java.lang.Object).
& nbsp & nbspJeśli nie wyrzucisz java.io.InvalidClassException.
| => Obiekt Java jest serializowalny tylko wtedy, gdy jego klasa lub którakolwiek z jego nadklas
| => Pola statyczne w klasie nie mogą być serializowane.
| => Jeśli nie chcesz serializować zmiennej klasy, użyj przejściowego słowa kluczowego
| => Jeśli klasa implementuje szeregowalny, to wszystkie jego podklasy również będą szeregowalne.
| => Jeśli klasa ma odwołanie do innej klasy, wszystkie odwołania muszą być możliwe do serializacji, w przeciwnym razie proces serializacji nie zostanie wykonany. W takim przypadku
NotSerializableException jest generowany w czasie wykonywania.
źródło
Przedstawię analogię, która może pomóc w utrwaleniu koncepcyjnego celu / praktyczności serializacji / deserializacji obiektu .
Wyobrażam sobie serializację / deserializację obiektu w kontekście próby przemieszczenia obiektu przez kanał burzowy. Obiekt jest zasadniczo „rozkładany” lub szeregowany w bardziej modułowe wersje siebie - w tym przypadku w szeregu bajtów - w celu skutecznego przejścia przez medium. W sensie obliczeniowym możemy postrzegać ścieżkę przebytą przez bajty przez kanał burzowy jako podobną do bajtów podróżujących przez sieć. Transmutujemy nasz obiekt, aby dostosować się do bardziej pożądanego środka transportu lub formatu. Zserializowany obiekt zwykle będzie przechowywany w pliku binarnym, z którego można później odczytać, zapisać lub jedno i drugie.
Być może, gdy nasz obiekt będzie w stanie prześlizgnąć się przez dren w postaci rozłożonej serii bajtów, możemy chcieć przechowywać tę reprezentację obiektu jako dane binarne w bazie danych lub na dysku twardym. Główną zaletą jest to, że w przypadku serializacji / deserializacji mamy możliwość pozostawienia naszego obiektu w postaci binarnej po serializacji lub „odzyskania” oryginalnej postaci obiektu przez przeprowadzenie deserializacji.
źródło