Serializowalny interfejs w Javie z przykładami

Opublikowany: 2021-11-29

Java oferuje kilka pakietów, z których jednym jest interfejs Serializable. Jest obecny w pakiecie Java java.io i jest rodzajem interfejsu znacznika. Po zdefiniowaniu jako interfejs znacznika w interfejsie nie ma żadnych metod ani pól. Tak więc za każdym razem, gdy jakiekolwiek klasy implementują interfejs, interfejs nie jest wymagany do implementacji jakichkolwiek metod. Klasy implementują interfejs, jeśli klasa chce, aby ich instancje były serializowane lub deserializowane.

Mechanizm serializacji służy do konwersji stanu obiektu na strumień bajtów. Ten mechanizm jest realizowany za pomocą ObjectOutputStream. Proces deserializacji jest przeciwieństwem procesu serializacji. W takim przypadku strumień bajtów jest konwertowany z powrotem na obiekt Java. ObjectInputStream służy do deserializacji.

Spis treści

Serializacja

Konwersja stanu dowolnego obiektu na strumień bajtów jest znana jako serializacja. A przeciwieństwem serializacji jest deserializacja. Obiekt Javy można przekształcić w strumień statycznych bajtów. Ten statyczny strumień można następnie zapisać w bazie danych lub przesłać do innej sieci. Proces serializacji jest zależny od wystąpienia. Oznacza to, że serializację obiektów można przeprowadzić na jednej platformie, a następnie deserializację obiektów można przeprowadzić na innej platformie. W procesie serializacji zaimplementowano określony typ interfejsu znacznika, „Serializable”. Zatem klasy kwalifikujące się do serializacji, tj . klasa możliwa do serializacji w Javie , powinny implementować interfejs znacznika.

Ten mechanizm zapisywania stanu obiektu w strumieniu bajtów jest znany jako serializacja. Mechanizm jest używany głównie w technologiach JMS, EJB, JPA, RMI i Hibernate.

ObjectInputStream i ObjectOutputStream to formy klas wysokiego poziomu, które rozszerzają java.io.InputStream i java.io.OutputStream. Typy podstawowe i grafy obiektów mogą być zapisywane w OutputStream przez ObjectOutputStream w bajcie

strumień. Strumień wynikający z konwersji można odczytać za pomocą ObjectInputStream. Tak więc w przypadku serializacji metoda writeObject() jest wywoływana z obiektu ObjectOutputStream, a w przypadku deserializacji metoda readObject() jest wywoływana z klasy ObjectInputStream.

Najważniejszą metodą w ObjectOutputStream jest:

Powyższy wiersz kodu pochodzi z https://www.baeldung.com/java-serialization.

W powyższym wierszu kodu pobierany jest obiekt, który można serializować, a następnie przekształcany jest w strumień lub strumień bajtów.

W przypadku ObjectInputStream najbardziej krytyczną metodą jest:

Powyższy wiersz kodu pochodzi z https://www.baeldung.com/java-serialization.

Powyższy wiersz kodu może odczytać sekwencję bajtów i przekonwertować ten strumień bajtów na obiekt Javy. Można przez to odrzucić pierwotny przedmiot.

Ilustrację procesu serializacji można opisać poniżej:

Klasa „Osoba” jest brana pod uwagę do serializacji. Pola statyczne nie są serializowane i należą do niektórych klas. Pola klasy można zignorować za pomocą słowa kluczowego „przejściowy” w procesie serializacji.

Źródło

Obiekt typu osoba można zapisać do jakiegoś lokalnego pliku, a następnie ponownie wczytać wartość. W tym celu można wykorzystać poniższy kod.

ObjectOutputStream został użyty do zapisania stanu obiektu do pliku za pomocą FileOutputStream. W tym przykładzie w katalogu projektu utworzono plik o nazwie „yourfile.txt”. Dzięki wykorzystaniu FileInputStream ładowany jest utworzony plik. Ten strumień jest następnie pobierany przez ObjectInputStream i konwertowany na nowy obiekt o nazwie p2. Stan załadowanego obiektu jest ostatecznie testowany i dopasowywany do stanu oryginalnego obiektu. Obiekt, który jest ładowany, musi być wyraźnie rzucony na typową osobę.

Ostrzeżenia dotyczące serializacji Javy

1. Dziedziczenie i skład

Za każdym razem, gdy użytkownik implementuje interfejs java.io.Serializable, wszystkie podklasy klas, które implementują interfejs, stają się możliwe do serializacji. Ponadto, jeśli obiekt zawiera odwołanie do innego obiektu, obiekty, do których odwołuje się implementacja interfejsu, są oddzielnie serializowane; jeśli te obiekty nie implementują interfejsu, zostanie wyrzucony wyjątek. Wyrzucony wyjątek będzie NotSerializableException. Ponadto, jeśli załóżmy, że tablica obiektów jest przechowywana w obiekcie możliwym do serializacji, wszystkie obiekty tablicy powinny być serializowane. Jeśli nie nastąpi serializacja obiektów, zgłosi wyjątek „NotSerializableException”.

2. UID wersji seryjnej

Dla każdej klasy, która implementuje interfejs Serializable, z każdą klasą jest skojarzona liczba. Numer jest powiązany z wirtualną maszyną Javy. Odbywa się to głównie w celu sprawdzenia, czy obiekty, które są ładowane i zapisywane, mają dokładne atrybuty. Tylko wtedy, gdy atrybuty są takie same, obiekty będą zgodne po serializacji. IDE generuje te liczby automatycznie i opiera się głównie na nazwach klasy, jej atrybutach i powiązanych z nią modyfikatorach dostępu. Jeśli ze zmian wynika inny numer, zostanie zgłoszony wyjątek „InvalidClassException”.

Jeśli serialVersionUID nie jest zadeklarowany przez klasę, którą można serializować, maszyna JVM automatycznie wygeneruje go w czasie wykonywania. Chociaż nastąpi automatyczne generowanie numeru, nadal zaleca się, aby klasy deklarowały serialVersionUID. Dzieje się tak, ponieważ serialVersionUID, który zostanie wygenerowany automatycznie, będzie zależny od kompilatora i może czasami generować nieoczekiwane wyjątki InvalidClassException.

3. Niestandardowa serializacja

W Javie ustawiono domyślny sposób serializacji obiektów. Java może zastąpić to domyślne zachowanie. Istnieje sposób na niestandardową serializację. Jest to szczególnie przydatne w przypadkach, gdy próbuje się serializować obiekt mający atrybuty, których nie można serializować. Serializację takich obiektów można wykonać za pomocą dwóch metod w ramach klasy, którą użytkownik chce serializować. Te dwie metody to:

Powyższe dwie metody mogą służyć do serializacji atrybutów do dowolnych formularzy, które można serializować, których wcześniej nie można było serializować.

Zalety serializacji w Javie

Jedną z zalet serializacji w Javie jest to, że stan obiektu może być przemieszczany w sieci.

Interfejs Java java.io.Serializable

java.io.Serializable to interfejs znacznika, co oznacza, że ​​w interfejsie nie ma żadnych metod ani obiektów. Podstawową funkcją interfejsu markera jest oznaczanie

klas Javy, aby nadać określoną zdolność wszystkim obiektom klas. Przykładami interfejsów znaczników są Remote i Cloneable.

Interfejs musi być zaimplementowany przez dowolną klasę, która używa interfejsu do serializacji swoich obiektów. Domyślnie klasy takie jak klasy opakowujące i klasa String implementują interfejs java.io.Serializable.

Przykład możliwy do serializacji w języku Java jest pokazany poniżej.

W powyższym kodzie można zauważyć, że klasa Student implementuje interfejs Serializable. W związku z tym, gdy klasa zaimplementuje interfejs Serializable, obiekty w klasie można przekonwertować na bajty strumienia.

  • Klasa ObjectOutputStream

Ta klasa służy do zapisywania podstawowych typów danych i obiektów Java w OutputStream. Obiekt, który obsługuje interfejs java.io.Serializable, może zostać użyty do zapisu do strumieni.

  • Klasa ObjectInputStream

Wszystkie dane pierwotne, które zostały zapisane przy użyciu ObjectOutputStream, są deserializowane przy użyciu ObjectInputStream.

Poniżej przedstawiono przykład interfejsu Serializable w języku Java.

W tym przykładzie klasa Student zostanie zserializowana. Metoda writeObject() klasy ObjectOutputStream zapewnia pełną funkcjonalność serializacji obiektów. Stan obiektu zapisywany jest w pliku o nazwie f.txt.

Wnioski

W artykule omówiono koncepcję serializacji w Javie. Wymienił interfejsy i inne ważne metody wymagane do serializacji obiektów klasy. Proces serializacji jest zawsze powiązany z identyfikatorem lub liczbą z każdą klasą, którą można serializować. Ten numer jest określany jako SerialVersionUID. Głównym zastosowaniem SerialVersionUID jest weryfikacja nadawcy i odbiorcy obiektu, który ma być serializowany. Dzieje się tak, ponieważ zarówno nadawca, jak i odbiorca powinni być tacy sami.

Jest to ważna cecha języka programowania Java. Jeśli chcesz dowiedzieć się więcej o tak ważnych funkcjach i koncepcjach w Javie oraz doskonalić swoje umiejętności w zakresie języka programowania, możesz sprawdzić kursy inżynierii oprogramowania oferowane przez upGrad. Jeśli jesteś pracującym profesjonalistą, kurs jest dla Ciebie najbardziej odpowiedni. W przypadku jakichkolwiek pytań można się skontaktować z naszym zespołem pomocy. Możesz również przeglądać naszą stronę internetową w celu znalezienia konkretnego kursu i uzyskać szczegółowe informacje.

Co to jest interfejs serializowalny w Javie?

Interfejs do serializacji to interfejs znacznika. Interfejs znacznika zawiera wskazówkę dla środowiska wykonawczego Java, że ​​klasa implementująca pozwala na serializację. Środowisko uruchomieniowe wykorzysta ten interfejs do serializacji obiektu. Serializowalny interfejs w javie to specjalny interfejs, który ma być zaimplementowany przez klasy danych w javie. Gdy klasa implementuje ten interfejs, można go utrwalić w bazie danych. Ten interfejs jest zadeklarowany w pakiecie java.io. Interfejs serializowalny ma dwie metody, readResolve() i writeReplace() , które służą do odczytu i zapisu obiektu w bazie danych.

Co się stanie, jeśli zaimplementujemy interfejs Serializable w Javie?

Implementacja interfejsu Serializable w Javie oznacza posiadanie obiektu, który może być serializowany i deserializowany w dowolnym systemie posiadającym interfejs Serializable. Implementacja takiego interfejsu byłaby skuteczna, gdy klasa jest serializowana zewnętrznie przez biblioteki stron trzecich (JSON, XML itp.) lub protokoły sieciowe. Gdy zmienna jest zadeklarowana jako Serializable, każde wystąpienie zmiennej zostanie serializowane i zdeserializowane, jeśli zostanie przekazane jako parametr do metody lub gdy zostanie zwrócone z metody. Serializacja jest wykonywana programowo, aby stan obiektu mógł zostać zachowany na później, gdy musi zostać zdeserializowany i przedstawiony użytkownikowi obiektu.

Czy możemy przesłać zserializowany obiekt przez sieć?

Obiekt serializowany to obiekt, który zawiera strumień bajtów. Konstruktor obiektu lub metody writeObject() / readObject() służą do umieszczania strumienia bajtów w obiekcie. Przechowywane dane mogą być tekstem, dźwiękiem, wideo lub dowolnymi niestandardowymi danymi aplikacji. Dane dla tych obiektów mogą być przechowywane w pliku lub na zdalnym serwerze. Aby przesłać zserializowane obiekty przez sieć, należy użyć protokołu RMI (Remote Method Invocation). RMI to dobry protokół do tworzenia aplikacji rozproszonych. Umożliwia klientowi komunikację z metodami na obiektach w aplikacji Java działającej na serwerze. Protokół RMI to mechanizm zdalnego wywoływania procedur (RPC).