Apa konsep Serialisasi di Jawa?



Artikel ini akan membantu dengan pendekatan komprehensif terhadap konsep Serialisasi di Jawa bersama dengan contoh waktu nyata untuk pemahaman yang lebih baik.

Serialisasi dalam adalah konsep penting yang berhubungan dengan konversi objek menjadi aliran byte untuk mengangkut objek java dari satu Mesin Virtual Java ke yang lain dan membuatnya kembali ke bentuk aslinya. Saya akan menyusun map untuk artikel ini seperti di bawah ini:

Apa itu Serialisasi di Java?

Serialisasi di Java adalah proses mengubah kode Java Obyek menjadi Aliran Byte , untuk mentransfer Kode Objek dari satu mesin Virtual Java ke yang lain dan membuatnya kembali menggunakan proses Deserialisasi.





Serialization-in-Java-Edureka-Picture-1

Mengapa kita membutuhkan Serialisasi di Jawa ?

Kami membutuhkan Serialisasi karena alasan berikut:



  • Komunikasi : Serialisasi melibatkan prosedur objek serialisasi dan penularan. Ini memungkinkan beberapa sistem komputer untuk merancang, berbagi, dan mengeksekusi objek secara bersamaan.

  • Caching : Waktu yang dihabiskan dalam membangun sebuah objek lebih banyak dibandingkan dengan waktu yang dibutuhkan untuk de-serialisasi itu. Serialisasi meminimalkan konsumsi waktu sebesar caching benda raksasa.

  • Deep Copy : Kloning Prosesnya dibuat sederhana dengan menggunakan Serialization. Tepat replika dari suatu benda diperolehmembuat serial objek ke a array byte , dan kemudian melakukan de-serialisasi.



  • Menyeberang Sinkronisasi JVM: Keuntungan utama dari Serialization adalah ituberfungsi di berbagai JVM yang mungkin berjalan di berbagai JVM ilmu bangunan atau Sistem operasi

  • Kegigihan: Status objek apa pun dapat langsung disimpan dengan menerapkan Serialisasi padanya dan disimpan dalam file database agar bisa diambil nanti.

Bagaimana cara kita menyusun Objek?

UNTUK Objek Java aku s serializable jika dan hanya jika kelasnya atau salah satu kelas induknya mengimplementasikan salah satu dari Jawa . saya . Dapat diserialkan antarmuka atau subinterface-nya, java.io.Externalizable.

Dalam proses Serialisasi, kami mengubah status objek menjadi aliran byte sehingga dapat ditransfer dari satu JVM ke yang lain dan mengembalikan aliran byte kembali ke objek asli.

// Antarmuka

package Serial1 import java.io.Serializable public class Karyawan mengimplementasikan 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 }}

// Berseri

package 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 = Karyawan baru (20120, 'Sam') FileOutputStream fout = baru FileOutputStream ('output.txt') ObjectOutputStream out = baru ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println ('Serialization dan Deserialization telah berhasil dijalankan')} catch (Exception e) {System.out.println (e)}}}

Keluaran:

Serialization dan Deserialization berhasil dijalankan

Deserialisasi : Ini adalah proses kebalikan dari Serialization di mana Arus Byte Serial dari suatu objek dari pengirim dibuat kembali di ujung penerima.

// Deserialise

paket Serial1 impor java.io. * class Depersist {public static void main (String args []) {coba {ObjectInputStream in = new ObjectInputStream (new FileInputStream ('output.txt')) Karyawan e1 = (Karyawan) in.readObject ( ) Karyawan e2 = (Karyawan) in.readObject () Karyawan e3 = (Karyawan) 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 (Exception e) {System.out.println (e)}}}

Keluaran:

20110 Yohanes
22110 Jerry

20120 Sam

Keuntungan dan Kerugian Serialisasi di Java

Keuntungan:

  • Proses serialisasi adalah a bawaan fitur yang tidak memerlukan perangkat lunak pihak ketiga untuk menjalankan Serialisasi
  • Prosedur Serialisasi terbukti sederhana dan mudah untuk mengerti

  • Prosedur serialisasi universal dan pengembang dari latar belakang berbeda sudah mengenalnya

  • Mudah digunakan dan mudah untuk disesuaikan

  • Aliran data berseri mendukung Enkripsi, Kompresi, Otentikasi dan komputasi Java yang aman

  • Ada banyak teknologi kritis mengandalkan serialisasi.

Kekurangan:

  • Objek saat DeSerialization menjadi rapuh dan mereka tidak yakin akan Di-DeSerialisasi secara efektif.

  • Variabel Transient dideklarasikan saat Serialization menciptakan ruang memori, tetapi konstruktor tidak dipanggil yang mengakibatkan kegagalan inisialisasi variabel transien yang mengakibatkan variasi ke Arus Java Standar.

    apa itu struktur data di java
  • Proses serialisasi adalah tidak efisien dalam hal pemanfaatan memori.

  • Serialisasi tidak disukai untuk digunakan dalam aplikasi yang membutuhkan akses bersamaan tanpa persyaratan API pihak ketiga , karena Serialization tidak menawarkan mekanisme kontrol transisi untuk setiap SE.

  • Prosedur serialisasi gagal ditawarkan kontrol yang sangat baik untuk mengakses Objek.

Contoh Praktis Serialisasi di Jawa

Serialisasi Menggunakan Inheritance

Kasus - 1: Jika Superclass Dapat Berseri, maka, secara default, Subkelasnya juga dapat diserialkan.

Dalam hal ini, file subclass dapat diserialkan secara default jika superclass sedang menerapkan Antarmuka yang Dapat Disambung

paket SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class A mengimplementasikan Serializable {int i public A (int i) {this.i = i}} kelas B meluas A {int j publik B (int i, int j) {super (i) this.j = j}} uji kelas publik {public static void main (String [] args) melempar Exception {B b1 = baru B (200.400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = baru FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objek telah diserialisasi') FileInputStream fis = new FileInputStream ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Objek telah dideserialisasi') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Keluaran:

j = 20
Objek telah diserialkan
Objek telah deserialisasi
i = 200
j = 400

Kasus - 2: Subclass dapat diserialkan jika mengimplementasikan Antarmuka yang Dapat Diserialisasi bahkan jika Superclass tidak mengimplementasikan Antarmuka yang Dapat Berseri.

Dalam hal ini, jika file superclass tidak mengimplementasikan Antarmuka yang Dapat Disambung , kemudian, objek dari subclass dapat diserialkan secara manual dengan mengimplementasikan Antarmuka Serializable di subkelas.

paket SerializationInheritance impor java.io.FileInputStream impor java.io.FileOutputStream impor java.io.ObjectInputStream impor java.io.ObjectOutputStream impor java.io.Serializable kelas superclass {int i publik superclass (int i) {this.i = i} public superclass () {i = 50 System.out.println ('Superclass konstruktor disebut')}} subclass kelas memperluas penerapan superclass Serializable {int j public subclass (int i, int j) {super (i) this.j = j }} public class test2 {public static void main (String [] args) throws Exception {subclass b1 = new subclass (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = FileOutputStream baru ('output.ser') ObjectOutputStream oos = baru ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objek telah diserialkan') FileInputStream fis = baru FileInputStream ('output.ser') ObjectInputStream ois = baru ObjectInputStream (fis) subclass b2 = (subclass) ois.readObject ( ) ois.close () fis.close () System.out.println ('Objek telah dideserialisasi') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Objek telah diserialkan
Konstruktor Superclass dipanggil
Objek telah deserialisasi
i = 50
j = 20

Kasus - 3: Jika superclass dapat diserialkan, tetapi kita tidak memerlukan subclass untuk diserialisasi.

Dalam hal ini, Serialisasi subclass dapat dicegahdengan menerapkan writeObject () dan readObject () metode di subclass dan perlu dibuang NotSerializableException dari metode ini.

paket SerializationInheritance impor java.io.FileInputStream impor java.io.FileOutputStream impor java.io.IOException impor java.io.NotSerializableException impor java.io.ObjectInputStream impor java.io.ObjectOutputStream impor kelas java.io.Serializable Parent mengimplementasikan Serializable {int 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) melempar IOException {throw new NotSerializableException ()} private void readObject (ObjectInputStream in) melempar 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 = baru FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objek telah diserialkan ') FileInputStream fis = baru FileInputStream (' abc.ser ') ObjectInputStream ois = baru ObjectInputStream (fis) anak b2 = (anak) ois.readObject () ois.close () fis.close () System.out. println ('Objek telah dideserialisasi') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Keluaran:

ilmu data apa itu

i = 100
j = 200
Pengecualian di thread 'main' java.io.NotSerializableException
di SerializationInheritance.child.writeObject (test3.java:48)
di sun.reflect.NativeMethodAccessorImpl.invoke0 (Metode Asli)

Serialisasi Menggunakan Anggota Statis

Serialisasi bidang anggota statis diabaikan dalam proses serialisasi. Serialisasi adalahterkait dengan keadaan terakhir objek. Oleh karena itu, hanya data yang terkait dengan instance tertentu dari kelas yangberseri tetapi bukan bidang anggota Statis.

paket stati import java.io. * class StaticSerial mengimplementasikan Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('Pada saat serialisasi, anggota statis memiliki nilai: '+ i) coba {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 ('Setelah Deserialization, static member memiliki nilai:' + i)} catch (Exception e) {System.out.println (e)}}}

Keluaran:

Pada saat serialisasi member statik bernilai: 100
Setelah Deserialization, static member memiliki nilai: 99

Antarmuka Eksternal

Itu Antarmuka Eksternal di Jawa mirip dengan Serialisasi tetapi satu-satunya perbedaan adalah bahwa ia mampu menawarkan serialisasi yang disesuaikan di mana Anda bisa memutuskan objek yang akan dibuang di sungai.

Antarmuka Externalizable tersedia di java.io dan menyediakan dua metode:

  • public void writeExternal (ObjectOutput out) melempar IOException
  • public void readExternal (ObjectInput in) melempar IOException

Perbedaan utama antara Serialization dan Externalizeable adalah sebagai berikut:

  • Penerapan : Externalizable Interface mengecualikan pengguna untuk secara eksplisit sebutkan objek yang akan diserialkan. Sementara di Antarmuka Serialisasi, semua objek dan variabel diserialkan di run-time.

  • Metode : Antarmuka yang dapat dieksternalisasi terdiri dari dua metode, yaitu:

    • writeExternal ()

    • readExternal ()

Sedangkan, Serializable Interface tidak menyertakan metode apa pun.

  • Proses: Proses serialisasi di Externalizable Interface menyediakan kustomisasi ke proses serialisasi. Tapi, Antarmuka Serialisasi akan menyediakan default proses serialisasi.

  • Kompatibilitas dan Kontrol Mundur: Externalizable Interface mendukung Serialization terlepas dari kontrol versi dan satu-satunya masalah adalah bahwa pengguna harus bertanggung jawab saat membuat serial Super Class. Di sisi lain, Serialization Interface membutuhkan versi yang sama dari JVM di kedua ujungnya tetapi menggabungkan serialisasi otomatis dari semua objek dan kelas termasuk superclass.

  • Pembuat No-Arg Publik: Kebutuhan Antarmuka Eksternalisasi Konstruktor Publik No-Arg untuk merekonstruksi objek serial. Sementara Serialization Interface tidak membutuhkan No-Arg Constructor, melainkan menggunakan refleksi untuk merekonstruksi objek atau kelas berseri.

paket ext import java.io. * class Demo mengimplementasikan 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' coba {FileOutputStream file = new FileOutputStream (nama file) ObjectOutputStream out = new ObjectOutputStream (file) out .writeObject (object) out.close () file.close () System.out.println ('Object has been serialized')} catch (IOException ex) {System.out.println ('IOException is catch')} Demo object1 = null coba {FileInputStream file = new FileInputStream (nama file) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('Objek telah deserialized ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException tertangkap ')} catch (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException tertangkap')}}}

Kata Kunci Transien

Kata Kunci Transien adalah a kata kunci yang dipesan di Jawa. Ini digunakan sebagai modifikasi variabel pada saat proses Serialisasi. Mendeklarasikan variabel dengan kata kunci Transient menghindari variabel tersebut menjadi Serial.

Versi Serial UID

Sebelum proses serialisasi dimulai, setiap kelas / objek yang dapat diserialkan dikaitkan dengan a nomor identifikasi unik disediakan oleh JVM mesin host. ID Unik ini disebut Versi Serial UID . UID ini digunakan sebagai identifikasi oleh JVM dari ujung penerima untuk mengonfirmasi bahwa objek yang sama sedang DeSerialisasi di ujung penerima.

Kontroversi Serialisasi di Jawa

Oracle Arsitek bermaksud untuk menghapus Serialisasi dari Java karena mereka menganggapnya sebagai Kesalahan Mengerikan tahun 1997 . Setelah penelitian yang sibuk, para pengembang di Oracle menemukan beberapa kekurangan dalam desain prosedur Serialisasi yang mengancam data.

Pada tahun 1997,Mark Reinhold menyatakan - “ Kami suka menyebut serialisasi sebagai 'hadiah yang terus memberi,' dan jenis hadiah yang terus diberikannya adalah kerentanan keamanan. Mungkin sepertiga dari semua kerentanan Java telah melibatkan serialisasi, bisa jadi lebih dari setengahnya. Ini adalah sumber kerentanan yang sangat subur, belum lagi ketidakstabilan. ”.

Ada kemungkinan bahwa Serialisasi akan dihapus atau diganti dalam pembaruan Java yang akan datang dan di sisi lain, untuk pemula di Java, Serialisasi tidak dapat menjadi pilihan yang idealis dalam proyek mereka

Praktik Terbaik saat menggunakan Serialisasi di Java

Berikut adalah beberapa praktik terbaik yang perlu diikuti

  • Dianjurkan untuk digunakan @bayu_joo tag serial untuk menunjukkan bidang yang dapat berseri.
  • Itu .menjadi ekstensi lebih disukai digunakan untuk file yang mewakili objek serial.
  • Tidak disarankan untuk menjalankan kolom statis atau sementara serialisasi default.
  • Kelas yang bisa diperpanjang tidak boleh Serialisasi kecuali itu wajib.
  • Kelas Batin harus dihindari untuk terlibat dalam Serialisasi.

Dengan ini, kita sampai pada akhir artikel ini. Saya harap Anda telah memahami dasar-dasar Serialisasi di Java, jenis dan fungsinya.

Lihat oleh Edureka, perusahaan pembelajaran online tepercaya dengan jaringan lebih dari 250.000 pelajar yang puas dan tersebar di seluruh dunia. Kursus pelatihan dan sertifikasi Java J2EE dan SOA Edureka dirancang untuk siswa dan profesional yang ingin menjadi Pengembang Java. Kursus ini dirancang untuk memberi Anda permulaan dalam pemrograman Java dan melatih Anda untuk konsep Java inti dan lanjutan bersama dengan berbagai kerangka kerja Java seperti Hibernate & Musim semi .

Ada pertanyaan untuk kami? Sebutkan di bagian komentar pada artikel 'Serialisasi di Java' dan kami akan menghubungi Anda kembali secepatnya.