Apakah konsep Serialisasi di Jawa?



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

Serialisasi di adalah konsep penting yang berkaitan dengan penukaran objek menjadi aliran bait untuk mengangkut objek java dari satu Mesin Maya Java ke yang lain dan mencipta semula ke bentuk semula. Saya akan menyusun soket untuk artikel ini seperti di bawah:

Apa itu Serialisasi di Java?

Serialisasi di Java adalah proses menukar kod Java Objek menjadi a Aliran Bait , untuk memindahkan Objek Objek dari satu mesin Virtual Java ke mesin Java yang lain dan mencipta semula menggunakan proses Deserialisasi.





Serialization-in-Java-Edureka-Picture-1

Mengapa kita memerlukan Serialisasi di Jawa ?

Kami memerlukan Serialisasi kerana alasan berikut:



  • Komunikasi : Serialisasi melibatkan prosedur objek bersiri dan penularan. Ini membolehkan pelbagai sistem komputer merancang, berkongsi dan melaksanakan objek secara serentak.

  • Caching : Masa yang digunakan dalam membangun objek lebih banyak dibandingkan dengan waktu yang diperlukan untuk membinasakannya. Serialisasi mengurangkan penggunaan masa dengan cache objek gergasi.

  • Salinan Dalam : Pengklonan proses dibuat mudah dengan menggunakan Serialisasi. Yang tepat replika objek diperoleh olehmembuat siri objek kepada a susunan bait , dan kemudian membatalkannya.



  • Menyeberang Penyegerakan JVM: Kelebihan utama Serialization adalah bahawa iaberfungsi di pelbagai JVM yang mungkin berjalan dengan cara yang berbeza seni bina atau Sistem operasi

  • Kegigihan: Keadaan objek boleh disimpan secara langsung dengan menggunakan Serialization padanya dan disimpan di a pangkalan data sehingga boleh diambil kemudian.

Bagaimanakah kita Menggabungkan Objek?

KE Objek Java adalah bersiri jika dan hanya jika kelasnya atau mana-mana kelas induknya melaksanakan salah satu jawa . Saya . Bersiri antara muka atau subinterfacenya, java.io. Boleh diluangkan.

Dalam proses Serialisasi, kita mengubah keadaan objek menjadi aliran byte sehingga dapat dipindahkan dari satu JVM ke yang lain dan mengembalikan aliran bait kembali ke objek asal.

// Antara muka

pakej Serial1 import java.io.Serializable kelas awam Kakitangan melaksanakan Serializable {private static final long serialVersionUID = 1L // Versi Serial UID int id Nama rentetan awam Kakitangan (int id, String name) {this.id = id this.name = name }}

// Bersiri

pakej Serial1 import java.io. * class Persist {public static void main (String args []) {cuba {Employee emp1 = new Employee (20110, 'John') Employee emp2 = new Employee (22110, 'Jerry') Employee emp3 = Pekerja baru (20120, 'Sam') FileOutputStream fout = FileOutputStream baru ('output.txt') ObjectOutputStream out = ObjectOutputStream baru (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println ('Serialization and Deserialization telah berjaya dilaksanakan')} catch (Exception e) {System.out.println (e)}}}

Pengeluaran:

Serialisasi dan Deserialisasi berjaya dilaksanakan

Deserialisasi : Ini adalah proses terbalik Serialisasi di mana Serialized Byte Stream dari objek dari pengirim dibuat semula pada penerima.

// Deserialise

pakej 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 ( ) Pekerja e2 = (Pekerja) di.readObject () Pekerja e3 = (Pekerja) di.readObject () System.out.println (e1.id + '' + e1.name) System.out.println (e2.id + '' + e2.name) System.out.println (e3.id + '' + e3.name) in.close ()} tangkapan (Pengecualian e) {System.out.println (e)}}}

Pengeluaran:

20110 John
22110 Jerry

20120 Sam

Kelebihan dan Kekurangan Serialisasi di Jawa

Kelebihan:

  • Proses serialisasi adalah terbina dalam ciri yang tidak memerlukan perisian pihak ketiga untuk menjalankan Serialisasi
  • Prosedur Serialisasi terbukti sederhana dan senang untuk memahami

  • Prosedur bersiri adalah sejagat dan pembangun dari pelbagai latar belakang sudah biasa dengannya

  • Ia senang digunakan dan mudah untuk disesuaikan

  • Aliran data bersiri menyokong Penyulitan, Pemampatan, Pengesahan dan pengkomputeran Java yang selamat

  • Terdapat banyak teknologi kritikal bergantung pada siri.

Kekurangan:

  • Objek semasa DeSerialization menjadi rapuh dan mereka tidak pasti akan Disterilkan dengan berkesan.

  • Pemboleh ubah sementara dinyatakan semasa Serialisasi mewujudkan ruang memori, tetapi konstruktor tidak dipanggil yang mengakibatkan kegagalan dalam inisialisasi pemboleh ubah sementara menghasilkan variasi ke Aliran Java Piawai.

  • Proses bersiri adalah tidak cekap dari segi penggunaan memori.

  • Serialisasi tidak digemari untuk digunakan dalam aplikasi yang memerlukan akses serentak tanpa syarat API pihak ketiga , kerana Serialisasi tidak menawarkan mekanisme kawalan peralihan setiap SE.

  • Prosedur serialisasi gagal ditawarkan kawalan halus untuk mengakses Objek.

Contoh praktikal Serialisasi di Jawa

Serialisasi Menggunakan Warisan

Kes - 1: Sekiranya Superclass Serializable, maka, secara lalai, Subclassnya juga boleh disenaraikan.

Dalam kes ini, the subkelas secara bersiri secara lalai jika superclass sedang melaksanakan Antara Muka Bersiri

cara menambahkan di java
pakej SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io. Kelas A yang boleh diserialisasikan menerapkan Serializable {int i public A (int i) {this.i = i}} kelas B memanjangkan A {int j awam B (int i, int j) {super (i) this.j = j}} ujian kelas awam {public static void main (String [] args) membuang Pengecualian {B b1 = baru B (200,400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = FileOutputStream baru ('abc.ser') ObjectOutputStream oos = ObjectOutputStream baru (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objek telah bersiri') 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 deserialized') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Pengeluaran:

j = 20
Objek tersebut telah bersiri
Objek tersebut telah terdeseralisasikan
i = 200
j = 400

Kes - 2: Subkelas dapat diselaraskan jika menerapkan Interface Serializable walaupun Superclass tidak melaksanakan Interface Serializable.

Dalam kes ini, sekiranya superclass tidak melaksanakan Antara Muka Bersiri , kemudian, objek dari subkelas boleh disusun secara manual dengan melaksanakan Serializable Interface di subkelas.

pakej SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Sercizable kelas superclass {int i public superclass (int i) {this.i = i} superclass awam () {i = 50 System.out.println ('Superclass konstruktor disebut')}} kelas subclass memperluas alat superclass Serializable {int j public subclass (int i, int j) {super (i) this.j = j }} kelas awam ujian2 {public static void main (String [] args) membuang Pengecualian {subclass b1 = subclass baru (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = new FileOutputStream ('output.ser') ObjectOutputStream oos = ObjectOutputStream baru (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objek telah diselaraskan') FileInputStream fis = FileInputStream baru ('output.ser') ObjectInputStream ois = subclass ObjectInputStream (fis) baru b2 = (subkelas) ois.readObject ( ) ois.close () fis.close () System.out.println ('Objek telah deserialized') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Objek tersebut telah bersiri
Pembina superclass dipanggil
Objek tersebut telah terdeseralisasikan
i = 50
j = 20

Kes - 3: Sekiranya superclass bersiri, tetapi kita tidak memerlukan subkelas untuk bersiri.

Dalam kes ini, Serialisasi subkelas dapat dicegahdengan melaksanakan tulisObjek () dan bacaObjek () kaedah dalam subkelas dan ia perlu dilemparkan NotSerializableException dari kaedah ini.

pakej 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.ObjectOutputStream import java.io.Serializable class Parentable i public Parent (int i) {this.i = i}} anak kelas meluaskan Parent {int j public child (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) melemparkan IOException {membuang notSerializableException ()} pembacaan peribadi yang kosong readObject (ObjectInputStream in) melemparkan IOException {membuang notSerializableException baru ()}} ujian kelas awam3 {public static void main (String [] args) melontarkan Pengecualian {child b1 = anak baru (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = FileOutputStream baru ('abc.ser') ObjectOutputStream oos = ObjectOutputStream baru ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objek telah bersiri ') FileInputStream fis = FileInputStream baru (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) anak b2 = (anak) ois.readObject () ois.close () fis.close () System.out. println ('Object telah deserialized') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Pengeluaran:

i = 100
j = 200
Pengecualian dalam utas 'utama' java.io.NotSerializableException
di SerializationInheritance.child.writeObject (test3.java:48)
di sun.reflect.NativeMethodAccessorImpl.invoke0 (Kaedah Asli)

Serialisasi Menggunakan Anggota Statik

Serialisasi bidang anggota statik tidak dihiraukan dalam proses serialisasi. Serialisasi adalahberkaitan dengan keadaan terkini objek. Oleh itu, hanya data yang dikaitkan dengan contoh tertentu kelasbersiri tetapi bukan bidang anggota Statik.

pakej stati import java.io. * class StaticSerial melaksanakan Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('Pada masa Serialization, ahli statik mempunyai nilai: '+ i) cuba {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = ObjectOutputStream baru (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = FileInputStream baru ('F: File.ser') ObjectInputStream ois = new ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('After Deserialization, anggota statik mempunyai nilai:' + i)} tangkapan (Pengecualian e) {System.out.println (e)}}}

Pengeluaran:

Pada masa Serialisasi, anggota statik mempunyai nilai: 100
Selepas Deserialization, anggota statik mempunyai nilai: 99

Antaramuka yang boleh diluar

The Antaramuka yang boleh diluar di Java serupa dengan Serialisasi tetapi satu-satunya perbezaan ialah ia mampu ditawarkan bersiri disesuaikan di mana anda dapat menentukan objek yang akan disimpan di sungai.

Antara muka luaran boleh didapati di java.io dan menyediakan dua kaedah:

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

Perbezaan utama antara Serialisasi dan Eksternalisasi adalah seperti berikut:

  • Pelaksanaan : Antaramuka luaran kecuali pengguna untuk secara eksplisit sebutkan objek yang akan bersiri. Semasa di Serialization Interface, semua objek dan pemboleh ubah bersiri di masa larian.

  • Kaedah : Antaramuka luaran terdiri daripada dua kaedah, iaitu:

    • tulisExternal ()

    • bacaExternal ()

Manakala, Serializable Interface tidak termasuk kaedah.

  • Proses: Proses bersiri dalam Interface Externalizable menyediakan penyesuaian ke proses bersiri. Tetapi, Antaramuka Serialisasi akan memberikan lalai proses bersiri.

cara membuang dua kali ganda ke int java
  • Keserasian dan kawalan ke belakang: Antaramuka luaran menyokong Serialisasi tanpa mengira kawalan versi dan satu-satunya masalah adalah pengguna mesti bertanggungjawab semasa membuat siri Super Class. Sebaliknya, Serialization Interface memerlukan versi yang sama JVM di kedua-dua hujungnya tetapi menggabungkan siri automatik semua objek dan kelas termasuk superclass.

  • Pembina No-Arg Awam: Keperluan Antaramuka Eksternalisasi Pembina No-Arg Awam untuk membina semula objek bersiri. Walaupun Serialization Interface tidak memerlukan No-Arg Constructor, sebaliknya ia menggunakan renungan untuk membina semula objek atau kelas bersiri.

pakej ext import java.io. * Demo kelas melaksanakan java.io.Serializable {public int a public String b public Demo (int a, String b) {this.a = a this.b = b}} kelas Test {public static void main (String [] args) {Demo object = new Demo (1, 'Welcome to Edureka') String filename = 'file.ser' cuba {FileOutputStream file = new FileOutputStream (nama fail) ObjectOutputStream out = ObjectOutputStream baru (file) keluar .writeObject (objek) out.close () file.close () System.out.println ('Object has serialized')} catch (IOException ex) {System.out.println ('IOException tertangkap')} Demo objek1 = null cuba {FileInputStream file = FileInputStream baru (nama file) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('Object telah deserialized ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException ditangkap ')} tangkapan (ex ClassNotFoundException) {System.out .println ('ClassNotFoundException ditangkap')}}}

Kata Kunci Sementara

Kata Kunci Sementara ialah kata kunci terpelihara di Jawa. Ia digunakan sebagai ubah ubah pada masa proses Serialisasi. Menyatakan pemboleh ubah dengan kata kunci sementara mengelakkan pemboleh ubah daripada bersiri.

UID Versi Bersiri

Sebelum proses serialisasi dimulakan, setiap kelas / objek yang boleh diselaraskan dikaitkan dengan a nombor pengenalan unik disediakan oleh JVM mesin hos. ID Unik ini dipanggil UID Versi Bersiri . UID ini digunakan sebagai pengenalpastian oleh JVM dari hujung penerima untuk mengesahkan bahawa objek yang sama sedang Disterilkan di hujung penerima.

Kontroversi Serialisasi di Jawa

Oracle Arkitek bermaksud menghapus Serialisasi dari Java kerana mereka menganggapnya sebagai Kesalahan Mengerikan pada tahun 1997 . Setelah membuat kajian yang sibuk, para pengembang di Oracle menemui beberapa kelemahan dalam reka bentuk prosedur Serialisasi yang menimbulkan ancaman terhadap data.

Pada tahun 1997,Mark Reinhold menyatakan - “ Kami suka menyebut serialisasi 'hadiah yang terus diberikan', dan jenis hadiah yang terus diberikannya adalah kelemahan keselamatan. Mungkin sepertiga dari semua kerentanan Java telah melibatkan serialisasi sehingga lebih dari separuh. Ini adalah sumber kerentanan yang luar biasa, belum lagi ketidakstabilan. '

Ada kemungkinan Serialisasi akan dihapus atau diganti dalam pembaruan Java yang akan datang dan di sisi lain, untuk pemula di Java, Serialization tidak boleh menjadi pilihan idealistik dalam projek mereka

Amalan Terbaik semasa menggunakan Serialisasi di Java

Berikut adalah beberapa amalan terbaik yang perlu dipatuhi

  • Adalah disyorkan penggunaan javadoc @ tag bersiri untuk menandakan medan Bersiri.
  • The .akan menjadi peluasan lebih disukai digunakan untuk fail yang mewakili objek bersiri.
  • Tidak digalakkan untuk menjalani medan statik atau sementara bersiri lalai.
  • Kelas yang boleh dilanjutkan tidak boleh Bersiri melainkan wajib.
  • Kelas Dalam harus dielakkan daripada terlibat dalam Serialisasi.

Dengan ini, kita sampai pada akhir artikel ini. Saya harap anda telah memahami asas-asas Serialisasi di Jawa, jenis dan fungsinya.

Lihat oleh Edureka, sebuah syarikat pembelajaran dalam talian yang dipercayai dengan rangkaian lebih daripada 250,000 pelajar berpuas hati yang tersebar di seluruh dunia. Kursus latihan dan pensijilan Java J2EE dan SOA Edureka dirancang untuk pelajar dan profesional yang ingin menjadi Pembangun Java. Kursus ini dirancang untuk memberi anda awal dalam pengaturcaraan Java dan melatih anda untuk konsep Java teras dan maju bersama dengan pelbagai kerangka kerja Java seperti Hibernate & Musim bunga .

Ada soalan untuk kami? Sebutkannya di bahagian komen artikel “Serialization in Java” ini dan kami akan menghubungi anda secepat mungkin.