Serializacja w Javie: wszystko, co musisz wiedzieć [2022]

Opublikowany: 2021-01-04

Wraz z rosnącym boomem branży IT wydaje się, że z każdym dniem rośnie nasza zależność od niej. Ten stały wzrost zmusił wielu pracujących profesjonalistów do zajęcia się językami programowania, aby pozostać aktualnym w branży. Podczas gdy branża wykorzystuje kilka języków do obsługi swoich klientów, kilka języków jest używanych częściej niż inne. Jednym z takich języków jest Java.

Niezależnie od tego, czy jesteś nowicjuszem, czy weteranem, solidna znajomość języka Java przyniesie Ci korzyści na każdym etapie Twojej przygody z oprogramowaniem. Jak każdy inny język programowania, Java zawiera również własny obszerny program nauczania. Trzeba codziennie ćwiczyć język, aby opanować wszystkie różne pojęcia, które go wyróżniają. Jedną z takich koncepcji, która bardzo pomaga użytkownikom, jest praktyka serializacji w Javie.

Spis treści

Wstęp

Serializacja w kontekście Javy odnosi się do procesu, w którym obiekt kodu Javy jest systematycznie przekształcany w strumień bajtów. Ma to na celu umożliwienie sprawnego transferu wspomnianego kodu obiektowego z jednej wirtualnej maszyny Javy do drugiej. W dalszej kolejności pozwala to na jego odtworzenie za pomocą deserializacji. Używamy serializacji, aby osiągnąć wiele celów. Przyjrzyjmy się najpopularniejszym i najistotniejszym z nich w poniższej sekcji.

Dlaczego używana jest serializacja?

Zjawisko przedstawiania obiektu jako ciągu bajtów ma sprawiedliwy udział w paradygmacie programowania. Gdy proces rozciąga się również na reprezentację danych obiektu, narzędzie zwiększa się wielokrotnie. Poniżej wymieniono niektóre z najczęstszych zastosowań serializacji w Javie.

Komunikacja

Serializacja w Javie pozwala na efektywną i szybką komunikację pomiędzy wieloma systemami komputerowymi. Jednostki te wykorzystują serializację i transmisję obiektów, aby ułatwić jednoczesne udostępnianie i projektowanie różnych obiektów. W konsekwencji skutkuje to również płynną ostateczną realizacją. W przypadku obszernych baz danych serializacja pozwala na bardzo uproszczone podejście do obsługi obiektów.

Buforowanie

Buforowanie, w szerszym znaczeniu, odnosi się do metody przechowywania informacji w celu uzyskania do nich dostępu w późniejszym czasie, poprzez zainwestowanie w nie minimalnej ilości czasu. Serializacja w Javie podpowiada buforowanie, minimalizując czas potrzebny na deserializację dużego obiektu. Powszechnie wiadomo, że czas potrzebny na zbudowanie obiektu jest znacznie dłuższy w porównaniu z czasem potrzebnym na deserializację. W związku z tym serializacja pomaga zoptymalizować zużycie czasu poprzez buforowanie stosunkowo większych obiektów w miksie.

Głęboka kopia

Głębokie kopiowanie w Javie odnosi się do procesu kopiowania obiektów z drzewa w taki sposób, że nie jest on zależny od żadnej z jego wcześniejszych wersji, które mogą podlegać pewnym zmianom. Ten proces klonowania jest znacznie łatwiejszy dzięki zastosowaniu serializacji. Poprzez serializację obiektu do tablicy bajtów, a następnie jego deserializację, użytkownik może uzyskać replikę wspomnianego obiektu.

Synchronizacja maszyn wirtualnych między Javą

Główna zaleta stosowania serializacji polega na tym, że umożliwia ona użytkownikowi działanie na różnych maszynach JVM. Po przyjęciu serializacji nie ma znaczenia, czy te maszyny JVM działają na tej samej lub różnych architekturach i systemach operacyjnych, czy nie.

Trwałość

Stosując serializację do obiektu, można bezpośrednio przechowywać stan elementu bez żadnych niedogodności. Co więcej, pozwala również użytkownikowi zapisać wspomniany stan w bazie danych, którą można później odzyskać w dowolnym momencie w przyszłości.

Przeczytaj: Pytania i odpowiedzi dotyczące serializacji Java

Serializacja obiektu — zaangażowany proces

Przed przystąpieniem do serializacji obiektu najpierw musimy ustalić, czy można go serializować, czy nie. Jak to określamy? Obiekt w Javie jest możliwy do serializacji wtedy i tylko wtedy, gdy jego klasa lub którakolwiek z jego klas nadrzędnych pozwala na implementację interfejsu java.io.Serializable. Kryteria są również spełnione, jeśli te klasy również implementują swój podinterfejs, którym jest java.io.Externalizable.

Jak omówiono powyżej, synchronizacja między maszynami JVM jest jedną z najpotężniejszych aplikacji korzystających z serializacji. Kiedy serializujemy obiekt, konwertujemy stan tego obiektu na strumień bajtów. Dzięki temu możliwe staje się przeniesienie obiektu z jednej wirtualnej maszyny Javy do drugiej. W konsekwencji ten strumień bajtów można również przekonwertować z powrotem na oryginalny obiekt.

Ta konwersja jest również nazywana deserializacją. Jest to odwrotny proces serializacji, w którym strumień bajtów obiektu od nadawcy, który został wcześniej serializowany, jest odtwarzany po stronie odbierającej.

Zalety serializacji w Javie

Omawiając zastosowania i zastosowania serializacji w poprzednich sekcjach, rzuciliśmy już trochę światła na jej różne zalety. Teraz nadszedł czas, aby przyjrzeć się im głębiej.

  • Jedną z najważniejszych zalet serializacji jest fakt, że jest to funkcja wbudowana. Aby zaimplementować lub wykonać serializację, nie musisz korzystać z pomocy oprogramowania innych firm.
  • Nawet dla początkujących użytkowników, którzy dopiero uczą się swoich zasad, serializacja jest dość łatwym procesem do nauczenia się i zrozumienia.
  • Często programiści wywodzący się z różnych środowisk programistycznych zdobywają doświadczenie, gdy mają do czynienia z niuansami nowego języka. Jednak w przypadku serializacji proces jest uniwersalny i dlatego jest raczej znany wszystkim programistom.
  • Jest nie tylko łatwy w użyciu i wdrażaniu, ale także równie łatwy w dostosowywaniu.
  • Obecnie istnieje szereg krytycznych technologii, które wykorzystują serializację w swoich operacjach. Dzieje się tak, ponieważ serializowane strumienie danych obsługują szyfrowanie, uwierzytelnianie, kompresję i bezpieczne przetwarzanie w języku Java.

Wady serializacji w Javie

Żaden język programowania nie jest w stu procentach doskonały i nie mogą się nimi twierdzić. W rezultacie koncepcje i procesy, które je tworzą, nie są pozbawione własnych wad. Oto niektóre z ogólnych wad związanych z procesem serializacji.

  • Niektóre procesy serializacji wymagają również zastosowania deserializacji w tandemie. Wadą zastosowania deserializacji jest to, że powoduje to kruchość obiektów. W rezultacie nigdy nie ma całkowitej pewności, że przedmiotowy obiekt zostanie skutecznie zdeserializowany.
  • Wywołanie procesu serializacji powoduje utworzenie wielu zmiennych przejściowych. Te zmienne przejściowe, po utworzeniu, zajmują dodatkowe miejsce w pamięci. Jednak wiele z tych zmiennych przejściowych nie zostanie zainicjowanych, ponieważ konstruktor nie jest wywoływany podczas tych procesów. Następnie wpływają na zmianę standardowego przepływu Java.
  • Pomimo wszystkich optymalizacji zużycia czasu, proces serializacji jest coraz bardziej nieefektywny, jeśli chodzi o wykorzystanie pamięci.
  • Proces serializacji nie oferuje żadnego mechanizmu kontroli przejścia na każdą Standard Edition Java. W rezultacie nie jest preferowane, aby był używany w połączeniu z aplikacjami, które wymagają równoległego dostępu, bez konieczności korzystania z zewnętrznych interfejsów API.
  • Korzystając z serializacji, często trzeba iść na kompromis w celu uzyskania precyzyjnej kontroli dostępu do obiektów.

Serializacja widziana przez praktyczny obiektyw

Do tej pory omówiliśmy proces serializacji jako koncepcję teoretyczną, w tym jego różne zalety i wady. Nadszedł czas, aby zagłębić się w dyskusję, która pozwoli nam zobrazować serializację z praktycznego punktu widzenia i jej implementację. Poniżej wymieniono kilka przypadków, które pomagają nam zrozumieć praktyczną realizację serializacji.

Musisz przeczytać: Właściwości i zalety JavaBeans: jak należy je wykorzystać?

Serializacja i dziedziczenie

Dziedziczenie w Javie jest szeroko definiowane jako zjawisko, w którym jedna klasa nabywa lub dziedziczy metody i pola innej klasy. Klasa, która dziedziczy właściwości, nazywana jest podklasą, a klasa, której właściwości są dziedziczone, nazywana jest nadklasą. Termin nadklasa jest również używany zamiennie z klasą bazową i klasą nadrzędną.

Nasz pierwszy przypadek dotyczy serializacji w kontekście nadklas. Ogólnie rzecz biorąc, jeśli nadklasę można serializować, to jej podklasy można również domyślnie uznać za serializowane. Oczywiście obowiązuje to tylko wtedy, gdy nadklasa implementuje interfejs Serializable. Jednak istnieją również pewne przypadki, w których podklasa może być serializowana, nawet jeśli nadklasa nie implementuje interfejsu Serializable.

Dzieje się tak, gdy podklasie udaje się zaimplementować interfejs Serializable w jednej pojemności. Jeśli nadklasa nie zaimplementuje interfejsu serializowalnego w żadnych okolicznościach, obiekty podklasy można ręcznie serializować, gdy sama podklasa implementuje interfejs możliwy do serializacji.

Czasami użytkownik może również natknąć się na trzecią możliwość. Taka możliwość pojawia się, gdy nadklasa jest serializowana, ale użytkownik nie musi całkowicie dostosowywać procesu w odniesieniu do podklasy.

W takich sytuacjach istnieją sposoby, dzięki którym można świadomie zapobiec niepożądanej serializacji podklasy. Można to zrobić poprzez zaimplementowanie w podklasie metod writeObject() i readObject(). Jednak samo wdrożenie tych metod nie wystarczy. Wraz z pisaniem tych metod użytkownik musi również upewnić się, że metody te nie wyrzucają NotSerializableException z ich implementacji.

Serializacja za pomocą elementu statycznego

Implementacja procesu serializacji kończy się ignorowaniem w procesie elementów pól statycznych. Dzieje się tak głównie dlatego, że serializacja jako procedura w dużej mierze dotyczy najnowszego stanu danego obiektu. W rezultacie, chociaż dane skojarzone z określoną instancją klasy są pomyślnie serializowane, nie jest to związane z polem statycznego elementu członkowskiego.

Serializacja w odniesieniu do dokumentów XML

Serializację obiektów Java do XML można osiągnąć na wiele sposobów. Przede wszystkim realizowane są przy pomocy XMLEncoder i XMLDecoder. Podstawowym celem serializacji obiektów Java do dokumentów XML jest próba ograniczenia różnych wad, które sam proces serializacji pociąga za sobą.

Jednym z najistotniejszych problemów w procesie serializacji jest to, że logika zapisywania i przywracania zserializowanych obiektów opiera się tylko na wewnętrznej strukturze klas składowych. Nie uwzględnia żadnych zmian, które mogły zostać wprowadzone w tych klasach w czasie, który upływa między zapisaniem obiektu a jego pobraniem. W konsekwencji prowadzi to do nieuchronnego niepowodzenia procesu deserializacji.

Serializacja również powoduje problemy z wersjonowaniem. Dzieje się tak, gdy użytkownik zapisuje obiekt przy użyciu jednej wersji klasy, ale próbuje deserializować tę samą klasę przy użyciu innej lub nowej wersji klasy. W tym przypadku proces deserializacji również kończy się niepowodzeniem.

W związku z tym, aby uniknąć wszystkich tych problemów, niektórzy użytkownicy wolą serializować obiekty do dokumentów XML, zamiast stosować konwencjonalne podejście do serializacji ich do formatu binarnego. Co więcej, serializacja obiektów Java do dokumentów XML zapewnia również, że obiekt staje się czytelny dla człowieka, co zapewnia najwyższy stopień wygody.

Zamówienie: Pytania i odpowiedzi dotyczące rozmowy kwalifikacyjnej w języku Java

Zrozumienie interfejsu, który można uzewnętrznić

Interfejs Externalizable w Javie jest bardzo podobny do interfejsu serializacji. Różnica polega na ich zdolności do oferowania dostosowanej serializacji. Interfejs, który można uzewnętrzniać, umożliwia wybór obiektów, które mają być przechowywane w strumieniu, podczas gdy interfejs serializacji nie zapewnia tych samych uprawnień.

Można skorzystać z interfejsu, który można uzewnętrznić pod java.io. Interfejs, który można uzewnętrznić, zapewnia użytkownikowi również dwie metody. Pierwszym z nich jest publiczne void writeExternal(ObjectOutput out) wyrzucające IOException. Drugi to publiczny void readExternal(ObjectOutput in) wyrzuca IOException.

Różnica między serializacją a eksternalizacją

Oprócz możliwości oferowania dostosowanej serializacji, niektóre inne kluczowe zmienne również oddzielają serializację i eksternalizację. W następnym segmencie przyjrzymy się im bliżej.

Realizacja

Jedna z głównych różnic między interfejsami możliwymi do serializacji i zewnętrznymi polega na ich implementacji. Interfejs, który można uzewnętrznić, oczekuje, że użytkownik wyraźnie wymieni obiekty, które mają być serializowane. To nie jest przypadek, gdy mamy do czynienia z interfejsem serializowalnym. W interfejsie możliwym do serializacji wszystkie obiekty i zmienne są serializowane bez żadnego rozróżnienia w czasie wykonywania.

Metody

Interfejs Externalizable składa się głównie z dwóch metod. Są to metody writeExternal() i readExternal(). Z drugiej strony interfejs serializowalny nie zawiera żadnych metod.

Proces

Kiedy ktoś przeprowadza proces serializacji w interfejsie, który można uzewnętrznić, otrzymuje przywilej dostosowanej serializacji. Natomiast w interfejsie możliwym do serializacji poddaliśmy się domyślnemu procesowi serializacji.

Wsteczna kompatybilność i kontrola

Interfejs Externalizable Interface obsługuje serializację bez zastrzeżeń do danej kontroli wersji. Jedynym problemem związanym z tym podejściem jest to, że użytkownik musi sam ponosić odpowiedzialność podczas serializacji superklasy. Wręcz przeciwnie, interfejs serializacji wymaga, aby na obu końcach była obecna ta sama wersja maszyn wirtualnych JVM. Pozwala jednak na domyślną serializację wszystkich obiektów i klas, w tym również nadklasy.

Publiczny konstruktor bez argumentów

Podczas rekonstruowania zserializowanego obiektu interfejs eksternalizacji wymaga użycia publicznego konstruktora bezargumentowego. Inaczej jest w przypadku interfejsu serializacji, który nie wymaga jawnie konstruktora bezargumentowego, ale raczej wykorzystuje odbicie do rekonstrukcji serializowanych obiektów i klas.

Serializacja w Javie: kontrowersje

Istnieje wiele kontrowersji związanych z koncepcją serializacji w Javie. Wiele z nich w pierwszej kolejności zajmuje się usuwaniem serializacji jako procedury. Powszechnie uważa się, że architekci Oracle od dawna rozważali usunięcie serializacji z Javy, ponieważ uważają to za straszny błąd z 1997 roku.

Według ich badań wady w konstrukcji procedury serializacji są na tyle duże, że stanowią zagrożenie dla samych danych. Pod tym względem Mark Reinhold w 1997 r. przypisał prawie jedną trzecią wszystkich luk w Javie procesowi serializacji, stwierdzając nawet, że iloraz może być również większy.

W związku z tym istnieje duże prawdopodobieństwo, że serializacja jako konstrukcja zostanie całkowicie usunięta lub zastąpiona z kronik Javy w nadchodzących aktualizacjach. Może tak być również dlatego, że większość ekspertów nie uważa serializacji za idealistyczną opcję, którą początkujący w Javie mogą wdrożyć w swoich projektach.

Przeczytaj także: Pomysły i tematy projektów Java

Pobierz kurs rozwoju oprogramowania z najlepszych światowych uniwersytetów. Zdobywaj programy Executive PG, Advanced Certificate Programs lub Masters Programs, aby przyspieszyć swoją karierę.

Wniosek

Dyskusji i rozważań na temat serializacji nie można zakończyć rzucając trochę światła na kilka jej najlepszych praktyk. Oto kilka z nich, które użytkownik musi zastosować, aby zapewnić sobie najlepsze wrażenia.

  • Do oznaczania pól możliwych do serializacji należy użyć znacznika javadoc@serial.
  • W przypadku plików, które reprezentują obiekty serializowane, zaleca się używanie rozszerzenia .ser.
  • Zwykle proces poddawania pól statycznych lub przejściowych domyślnej serializacji jest mile widziany.
  • O ile nie jest to absolutnie obowiązkowe, należy w każdych okolicznościach unikać serializacji klas rozszerzalnych.
  • Podczas implementacji serializacji należy upewnić się, że klasy wewnętrzne nie zostaną zaangażowane w proces serializacji.

Jeśli chcesz dowiedzieć się więcej o Javie, programach OOP i tworzeniu pełnego stosu oprogramowania, zapoznaj się z programem Executive PG UpGrad i IIIT-B w zakresie tworzenia pełnego stosu oprogramowania, który jest przeznaczony dla pracujących profesjonalistów i oferuje ponad 500 godzin rygorystycznego szkolenia, Ponad 9 projektów i zadań, status absolwentów IIIT-B, praktyczne praktyczne projekty zwieńczenia i pomoc w pracy z najlepszymi firmami

Przygotuj się na karierę przyszłości

Aplikuj teraz na studia magisterskie z inżynierii oprogramowania