Jaka jest koncepcja serializacji w Javie?

Ten artykuł pomoże w kompleksowym podejściu do koncepcji serializacji w Javie wraz z przykładami w czasie rzeczywistym dla lepszego zrozumienia.

Serializacja w jest ważną koncepcją, która dotyczy konwersji obiektów na strumień bajtów w celu transportu obiektów Java z jednej wirtualnej maszyny języka Java do drugiej i odtworzenia ich do oryginalnej postaci. Ustawię akt w tym artykule, jak poniżej:



Co to jest serializacja w Javie?

Serializacja w Javie to proces konwersji kodu Java Obiekt do Strumień bajtów , aby przenieść kod obiektu z jednej wirtualnej maszyny języka Java na inną i odtworzyć go przy użyciu procesu Deserializacja.



Serialization-in-Java-Edureka-Picture-1

Dlaczego potrzebujemy serializacji w Javie ?

Potrzebujemy serializacji z następujących powodów:



  • Komunikacja : Serializacja obejmuje procedurę obiektu serializacja i przenoszenie. Umożliwia to wielu systemom komputerowym jednoczesne projektowanie, udostępnianie i wykonywanie obiektów.

  • Buforowanie : Czas poświęcony na budowanie obiektu jest dłuższy w porównaniu z czasem wymaganym do deserializacji go. Serializacja minimalizuje zużycie czasu przez buforowanie gigantyczne obiekty.

  • Głęboka kopia : Klonowanie proces jest uproszczony przy użyciu serializacji. Dokładny replika obiektu jest uzyskiwany przezserializowanie obiektu do pliku tablica bajtów , a następnie de-serializacji.



  • Krzyż Synchronizacja JVM: Główną zaletą serializacji jest to, żedziała na różnych maszynach JVM, które mogą działać na różnych architektury lub System operacyjny

  • Trwałość: Stan dowolnego obiektu można bezpośrednio przechowywać przez zastosowanie do niego serializacji i przechowywać w pliku Baza danych aby tak było odzyskane później.

Jak serializujemy obiekt?

DO Obiekt Java jest serializowalny wtedy i tylko wtedy, gdy jego klasa lub dowolna z jej klas nadrzędnych implementuje Jawa . ja . Możliwość serializacji interfejs lub jego podinterfejs, java.io.Externalizable.

W procesie serializacji konwertujemy stan obiektu na strumień bajtów, aby można go było przenieść z jednej maszyny JVM do drugiej i przywrócić strumień bajtów z powrotem do oryginalnego obiektu.

//Berło

pakiet Serial1 import java.io.Serializable klasa publiczna Pracownik implementuje Serializable {private static final long serialVersionUID = 1L // Serial Version UID int id String name public Employee (int id, String name) {this.id = id this.name = name }}

// Serializuj

pakiet Serial1 import java.io. * class Persist {public static void main (String args []) {try {Employee emp1 = new Employee (20110, 'John') Employee emp2 = new Employee (22110, 'Jerry') Employee emp3 = nowy pracownik (20120, 'Sam') FileOutputStream fout = new FileOutputStream ('output.txt') ObjectOutputStream out = new ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println ('Serializacja i deserializacja została pomyślnie wykonana')} catch (Wyjątek e) {System.out.println (e)}}}

Wynik:

Serializacja i deserializacja zostały pomyślnie wykonane

Deserializacja : Jest to proces odwrotny do serializacji, w którym serializowany strumień bajtów obiektu od nadawcy jest odtwarzany na końcu odbierającym.

// Deserialise

pakiet Serial1 import java.io. * class Depersist {public static void main (String args []) {try {ObjectInputStream in = new ObjectInputStream (new FileInputStream ('output.txt')) Employee e1 = (Employee) in.readObject ( ) Pracownik e2 = (Pracownik) in.readObject () Pracownik e3 = (Pracownik) in.readObject () System.out.println (e1.id + '' + e1.name) System.out.println (e2.id + '' + e2.name) System.out.println (e3.id + '' + e3.name) in.close ()} catch (Wyjątek e) {System.out.println (e)}}}

Wynik:

20110 John
22110 Jerry

20120 Sam

Zalety i wady serializacji w Javie

Zalety:

  • Proces serializacji to wbudowany funkcja, która nie wymaga oprogramowania innych firm do wykonania serializacji
  • Udowodniono, że procedura serializacji jest prosty i łatwo rozumieć

  • Procedura serializacji to uniwersalny i deweloperzy z różnych środowisk są z nim zaznajomieni

  • Jest łatwy w użyciu i łatwe do dostosowania

  • Zserializowane strumienie danych obsługuje szyfrowanie, kompresję, uwierzytelnianie i bezpieczne przetwarzanie w języku Java

  • Jest wiele krytyczne technologie opierając się na serializacji.

Niedogodności:

  • Obiekty, gdy staje się DeSerialization kruchy i nie ma pewności, czy zostaną skutecznie zdeserializowane.

  • Zmienne przejściowe zadeklarowane, gdy serializacja tworzy przestrzeń pamięci, ale konstruktor nie jest wywoływany, co powoduje niepowodzenie w inicjalizacji zmiennych przejściowych, co powoduje odmiana Standardowego przepływu języka Java.

    sql server tutorial dla początkujących z przykładami
  • Proces serializacji to nieskuteczny pod względem wykorzystania pamięci.

  • Nie zaleca się stosowania serializacji w aplikacjach, które tego wymagają jednoczesny dostęp bez wymogu interfejsy API innych firm , ponieważ serializacja nie oferuje żadnego mechanizmu kontroli przejścia dla każdej SE.

  • Procedura serializacji nie działa drobnoziarnista kontrola aby uzyskać dostęp do obiektów.

Praktyczne przykłady serializacji w Javie

Serializacja przy użyciu dziedziczenia

Przypadek - 1: Jeśli nadklasa jest możliwa do serializacji, to domyślnie jej podklasy są również serializowane.

W tym przypadku podklasa jest możliwy do serializacji domyślnie, jeśli superklasa wdraża Interfejs szeregowy

pakiet SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class A implementuje Serializable {int i public A (int i) {this.i = i}} klasa B rozszerza A {int j public B (int i, int j) {super (i) this.j = j}} public class Test {public static void main (String [] args) rzuca Wyjątek {B b1 = new B (200.400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = nowy ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Obiekt został zserializowany') FileInputStream fis = new FileInputStream ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Obiekt został zdeserializowany') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Wynik:

j = 20
Obiekt został zserializowany
Obiekt został zdeserializowany
i = 200
j = 400

Przypadek - 2: Podklasa może być serializowana, jeśli implementuje interfejs serializowalny, nawet jeśli nadklasa nie implementuje interfejsu szeregowego.

W takim przypadku, jeśli superklasa nie implementuje Interfejs szeregowy , a następnie obiekty podklasa można serializować ręcznie, implementując interfejs serializowalny w podklasie.

pakiet SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class superclass {int i public superclass (int i) {this.i = i} public nadklasa () {i = 50 System.out.println ('Nazwa konstruktora nadklasy')}} podklasa klasy rozszerza implementacje nadklasy Serializable {int j public subclass (int i, int j) {super (i) this.j = j }} public class test2 {public static void main (String [] args) rzuca Wyjątek {podklasa b1 = nowa podklasa (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = new FileOutputStream ('output.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Obiekt został zserializowany') FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) subclass b2 = (subclass) ois.readObject ( ) ois.close () fis.close () System.out.println ('Obiekt został zdeserializowany') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Obiekt został zserializowany
Konstruktor nadklasy o nazwie
Obiekt został zdeserializowany
i = 50
j = 20

Przypadek - 3: Jeśli nadklasa jest możliwa do serializacji, ale nie potrzebujemy serializacji podklasy.

W takim przypadku można zapobiec serializacji podklasywdrażając writeObject () i readObject () metody w podklasie i musi rzucić NotSerializableException z tych metod.

pakiet SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.NotSerializableException import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class Parentizable i public Parent (int i) {this.i = i}} class child extends Parent {int j public child (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) rzuca IOException {throw new NotSerializableException ()} private void readObject (ObjectInputStream in) throws IOException {throw new NotSerializableException ()}} public class test3 {public static void main (String [] args) throws Exception {child b1 = new child (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Obiekt został zserializowany ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) child b2 = (child) ois.readObject () ois.close () fis.close () System.out. println ('Obiekt został zdeserializowany') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Wynik:

tablica obiektów java

i = 100
j = 200
Wyjątek w wątku „main” java.io.NotSerializableException
w SerializationInheritance.child.writeObject (test3.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (metoda natywna)

Serializacja przy użyciu statycznego elementu członkowskiego

Serializacja statycznego pola składowego jest ignorowana w procesie serializacji. Serializacja jestzwiązane z ostatnim stanem obiektu. Stąd tylko dane skojarzone z konkretną instancją klasy sąserializowany, ale nie statyczny element członkowski.

pakiet stati import java.io. * class StaticSerial implementuje Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('W czasie serializacji, statyczny element członkowski ma wartość: '+ i) try {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = new FileInputStream ('F: File.ser') ObjectInputStream ois = new ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('Po deserializacji statyczny element członkowski ma wartość:' + i)} catch (wyjątek e) {System.out.println (e)}}}

Wynik:

W momencie serializacji statyczny element członkowski ma wartość: 100
Po deserializacji statyczny element członkowski ma wartość: 99

Interfejs z możliwością eksternalizacji

Plik Interfejs z możliwością eksternalizacji w Javie jest podobny do serializacji, ale jedyną różnicą jest to, że jest w stanie zaoferować dostosowana serializacja gdzie możesz zdecydować, jakie obiekty mają być posortowane w strumieniu.

Interfejs z możliwością eksternalizacji jest dostępny w java.io i udostępnia dwie metody:

  • public void writeExternal (ObjectOutput out) zgłasza IOException
  • public void readExternal (ObjectInput in) zgłasza wyjątek IOException

Kluczowe różnice między serializacją a możliwością eksternalizacji są następujące:

  • Realizacja : Interfejs z możliwością eksternalizacji z wyjątkiem użytkownika do wyraźnie wspomnieć o obiektach do serializacji. W interfejsie serializacji wszystkie obiekty i zmienne są serializowane w w czasie wykonywania.

  • Metody : Interfejs z możliwością eksternalizacji składa się z dwóch metod, a mianowicie:

    • writeExternal ()

    • readExternal ()

Podczas gdy interfejs serializowalny nie obejmuje żadnych metod.

  • Proces: Proces serializacji w interfejsie eksternalizowalnym zapewnia dostosowywanie do procesu serializacji. Ale interfejs serializacji zapewni domyślna proces serializacji.

  • Kompatybilność wsteczna i kontrola: Interfejs z możliwością eksternalizacji obsługuje serializację niezależnie od kontrola wersji a jedynym problemem jest to, że użytkownik musi być odpowiedzialny za serializowanie superklasy. Z drugiej strony interfejs serializacji wymaga ta sama wersja maszyn JVM na obu końcach, ale zawiera automatyczną serializację wszystkich obiektów i klas, w tym nadklasy.

  • Publiczny konstruktor bez argumentu: Potrzeby interfejsu eksternalizacji Publiczny konstruktor bez argumentu aby zrekonstruować serializowany obiekt. Chociaż interfejs serializacji nie wymaga konstruktora No-Arg, zamiast tego używa odbicie aby zrekonstruować serializowany obiekt lub klasę.

pakiet ext import java.io. * class Demo implementuje java.io.Serializable {public int a public String b public Demo (int a, String b) {this.a = a this.b = b}} class Test {public static void main (String [] args) {Demo object = new Demo (1, 'Welcome to Edureka') String filename = 'file.ser' try {FileOutputStream file = new FileOutputStream (filename) ObjectOutputStream out = new ObjectOutputStream (file) out .writeObject (obiekt) out.close () file.close () System.out.println ('Obiekt został zserializowany')} catch (IOException ex) {System.out.println ('IOException jest złapany')} Demo object1 = null try {FileInputStream file = new FileInputStream (filename) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('Obiekt został deserialized ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException is catch ')} catch (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException został przechwycony')}}}

Przejściowe słowo kluczowe

Przejściowe słowo kluczowe to zastrzeżone słowo kluczowe w Javie. Jest używany jako plik zmienna modyfikuj w czasie procesu serializacji. Zadeklarowanie zmiennej za pomocą słowa kluczowego Transient zapobiega serializacji zmiennej.

UID wersji szeregowej

Przed rozpoczęciem procesu serializacji każda możliwa do serializacji klasa / obiekt jest skojarzona z plikiem niepowtarzalny numer identyfikacyjny udostępniane przez maszynę JVM hosta. Ten unikalny identyfikator nazywa się UID wersji szeregowej . Ten identyfikator UID jest używany do identyfikacji przez maszynę JVM strony odbierającej w celu potwierdzenia, że ​​ten sam obiekt jest poddawany deSerializacji po stronie odbierającej.

Kontrowersje związane z serializacją w Javie

Oracle Architekci zamierzają usunąć serializację z Java, ponieważ uważają ją za plik Okropny błąd 1997 roku . Po gorączkowych badaniach programiści Oracle odkryli kilka błędów w projekcie procedury serializacji, które stanowią zagrożenie dla danych.

W roku 1997Mark Reinhold stwierdza: „ Lubimy nazywać serializację „prezentem, który ciągle daje”, a rodzaj prezentu, który wciąż daje, to luki w zabezpieczeniach. Prawdopodobnie jedna trzecia wszystkich luk w Javie dotyczyła serializacji, a może to być ponad połowa. Jest to zadziwiająco urodzajne źródło luk w zabezpieczeniach, nie wspominając o niestabilności ”.

Są szanse, że serializacja zostanie usunięta lub zastąpiona w nadchodzących aktualizacjach Javy, az drugiej strony, dla początkującego w Javie, Serializacja nie móc być opcją idealistyczną w swoich projektach

Najlepsze rozwiązania dotyczące korzystania z serializacji w języku Java

Poniżej przedstawiono kilka sprawdzonych metod, których należy przestrzegać

  • Zalecane użycie javadoc @ znacznik seryjny do oznaczania pól serializowalnych.
  • Plik .być rozszerzenie jest preferowane w przypadku plików reprezentujących obiekty serializowane.
  • Nie zaleca się wykonywania jakichkolwiek pól statycznych lub przejściowych domyślna serializacja.
  • Rozszerzalne klasy nie powinny być serializowane, chyba że tak jest obowiązkowy.
  • Klasy wewnętrzne należy unikać udziału w serializacji.

Tym samym dotarliśmy do końca tego artykułu. Mam nadzieję, że zrozumiałeś podstawy serializacji w Javie, jej rodzaje i funkcje.

Sprawdź autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Szkolenie i certyfikacja J2EE i SOA firmy Edureka jest przeznaczony dla studentów i profesjonalistów, którzy chcą zostać programistą Java. Kurs ma na celu zapewnienie przewagi w programowaniu w języku Java i przeszkolenie zarówno podstawowych, jak i zaawansowanych koncepcji Java, a także różnych struktur Java, takich jak Hibernate i Wiosna .

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy w tym artykule „Serializacja w Javie”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.