Java menyediakan mekanisme yang disebut serialisasi.
Oleh karena itu, jika kita memiliki serial objek, itu dapat dibaca dan dinonaktifkan melalui jenis objek dan informasi lainnya, dan akhirnya mendapatkan prototipe objek.
ObjectInputStream dan ObjectOutputStream Objects adalah objek streaming tingkat tinggi, termasuk serialisasi dan metode belakang.
ObjectOutputStream memiliki banyak metode untuk objek serial.
Private void writeObject (ObjectOutputStream OS) melempar IoException {}
ObjectInputStream serupa memberikan metode berikut:
Private Void Brand (ObjectInputStream IS) melempar IoException, ClassNotFoundException {}
Jadi di mana perlu diserialisasi? Serialisasi biasanya menggunakan data transmisi jaringan, atau menyimpan objek ke file. Data yang disebutkan di sini adalah objek dan bukan teks.
Masalahnya sekarang adalah bahwa arsitektur jaringan kami dan hard disk hanya dapat mengidentifikasi biner dan byte, dan tidak dapat mengenali objek Java.
Serialisasi adalah untuk menerjemahkan nilai/status dalam objek Java ke dalam byte untuk mengirimkan atau menyimpan melalui jaringan. Selain itu, serialisasi ketergantungan adalah membaca kode byte dan menerjemahkannya kembali ke objek Java.
Konsep SerialVersionuid
SerialVersionuid digunakan untuk memastikan objek yang sama (yang dapat digunakan dalam serialisasi) dapat dimuat selama proses deserialisasi. SerialVersionuid adalah kontrol versi untuk objek. Anda dapat merujuk ke SerialVersionuid dalam serialisasi Java untuk mendapatkan informasi lebih lanjut.
Untuk serialisasi:
Langkah -langkahnya adalah sebagai berikut:
Mari kita lihat daftar:
Buat karyawan.java di src-> org.arpit.javapostsforning
1. Imployee.java
paket org.arpit.javapostsforning; = EmplingeeId;} public string getEmployeename () {return groomeeName;} public void setempleeName (string employeeName) {this.employeena me = goudeeename;} public string getDepPartment () {return department;} public void setDepment (string department) {this. Depapartment = departemen;}}
Seperti yang Anda lihat, jika Anda perlu membuat serial kelas apa pun, maka Anda harus mengimplementasikan antarmuka serial yang dapat diseret.
Antarmuka penanda di Java adalah antarmuka tanpa bidang atau metode apa pun.
2.Serializemain.java
paket org.arpit.javapostsforning; ] ARGS) {karyawan EMP = karyawan baru (); ser "); ObjectPutStream outstream = ObjectPutStream baru (fileout); outstream.writeObject (emp); outstream.close (); pengecualian i) {i.printstacktrace ();}}}}
Untuk back -sequentialization:
Langkahnya adalah
Dalam paket src-> org.arpit.javapostsforlearning, buat deserializemain.java
3.Deserializemain.java
Paket org.arpit.javapostsforning; Null; IOException i) {i.printstacktrace (); ... "); System.out.println (" emp ID: " + emp.geteMeMeMireId ()); System.out.println (" Nama: " + emp.geteMeMeMeMeMeTeeName ()); stem.out.println (" Departemen: " + emp.getDeppartment ());}}
4. Jalankan:
Pertama jalankan serializemain.java, lalu jalankan deserializemain.java, Anda akan mendapatkan hasil berikut:
Deserialized Emblayee ... emp ID: 101Name: ArpitDepapartment: CS
Dengan cara ini, kami membuat serial objek karyawan dan membawanya ke sana. Ini terlihat sederhana, tetapi jika berisi referensi dan warisan objek, situasinya akan menjadi rumit. Mari kita lihat contoh satu per satu untuk melihat bagaimana mencapai serialisasi pada berbagai kesempatan.
Kasus 1 -Jika objek mengutip objek lain, apa yang harus saya lakukan
Kami telah melihat contoh -contoh berbasis urutan paling sederhana. Bagaimana kita bisa membuat serial? Akankah objek yang dikutip juga membuat serial? Ya, Anda tidak perlu berseri secara eksplisit. Saat Anda membuat serialisasi objek apa pun, jika berisi objek referensi, maka serialisasi Java akan secara otomatis membuat serialisasi seluruh diagram objek objek. Misalnya, karyawan sekarang mengutip objek alamat, dan alamat juga mengutip objek lain (misalnya, rumah), lalu ketika Anda membuat serialisasi objek karyawan, semua objek yang dikutip lainnya, seperti alamat dan rumah, akan secara otomatis diserialisasi dengan serialisasi Mari kita buat kelas alamat dan tambahkan objek alamat sebagai referensi untuk menambahkannya ke kelas karyawan.
Karyawan.java:
paket org.arpit.javapostsforning; This.employeeId = emplingeeId;} public string geteMireeNeame () {return {} public void public setempoloyeename (string usaha kerja) {this.emplayeename = karyawan publiceeName;} public getdepartment () {departemen pengembalian;} public void setDeppartment (string string) {departemen public; This.department = departemen;} alamat publik getAddress () {return alamat;} public void setaddress (alamat alamat) {this.address = alamat;
Dalam paket org.arpit.javapostsforlerning, buat alamat.java
Alamat.java:
paket org.arpit.javapostsforning; ini .city = city;} public int gethomeno () {return homeno;} public void setHomeno (int home) {this.homeno = homeno;} public stringstStreet () {street;} public void setStreet (String Street) {this. Street = street;} public string getCity () {return city;} public void setCity (string city) {this.city = city;}}
Di org.arpit.javapostsforlerning, buat serializedeserializemain.java
Serializedeserializemain.java:
Paket org.arpit.javapostsforning; Mandliya */ public static Main (String [] args) {karyawan emp = karyawan baru (); 88, MG Road "," Pune "); tutup ();} catch (ioException i) {i.printstacktrace ();} /deserialize emp = l; (Karyawan) di.reamObject (); Karyawan Deserialized ... "); System .out.println (" emp ID: " + emp.geteMeMeadeeId ()); System.out.println (" Nama: " + emp.geteMeadeeName ()); mp.getDepartment () );
Jalankan:
Saat Anda menjalankan serializedeserializemain.java. Anda akan mendapatkan hasil seperti itu:
java.Io.notserializableException: Org.arpit.javapostsforning.address at Java.io.objectPuttream.writeObject0 (UNKNOWN SOURCE) at Java.i O.ObjectPutstream.defaultWriteFields (Unknown Source) at java.io.objectPuttream.writeSerialData (UNKNOWN SOURCE) di java.io.objectputStream.writeordinaryObject (sumber yang tidak diketahui) di java.io.objectputtream.writeObject0 (sumber yang tidak diketahui) di java.io.ob.ob jectoutputstream.writeObject (sumber yang tidak diketahui)
Kami akan menjelaskan di mana itu salah. Saya lupa mengatakan bahwa kelas alamat juga harus diserialisasi. Maka kelas alamat harus mewarisi antarmuka serialzable.
Alamat.java:
Implementasi kelas publik; .City = city;} public int gethomeno () {return homeno;} public void sethomeno (int homeno) {this.homeno = homeno;} public stringstreet () {) return street; e} public void setStreet (string street) {ini .Street = street;} public string getCity () {return city;} public void setCity (string city) {this.city = city;}}}
Jalankan lagi:
Saat Anda menjalankan lagi serializedeserializemain.java. Anda bisa mendapatkan hasil berikut
Deserialized Emblayee ... emp ID: 101Name: ArpitDepartemen: CScity: Pune
Kasus 2: Jika kami tidak dapat mengakses kode sumber objek referensi (misalnya, Anda tidak dapat mengakses kode sumber kelas alamat di atas)
Jika kami tidak dapat mengakses kelas alamat, bagaimana kami dapat mengimplementasikan antarmuka serializable di kelas alamat? Apakah ada cara lain untuk mencapainya? Ya, Anda dapat membuat kelas lain, mewarisi alamatnya, dan kemudian membiarkannya mewarisi antarmuka yang dapat di -serial, tetapi untuk situasi berikut, solusi ini akan gagal:
Jika kelas referensi didefinisikan sebagai final
Jika kelas referensi merujuk objek lain yang tidak terialisasi
Jadi, bagaimana kita bisa membuat serial objek karyawan? Solusinya adalah menandai transisi. Jika Anda tidak perlu membuat serialisasi bidang apa pun, tandai saja sebagai sementara.
Alamat Alamat Transien
Di kelas karyawan, setelah alamat ditandai sebagai sementara, jalankan program. Anda akan mendapatkan NullpointerException, karena referensi alamat akan menjadi nol selama proses deepery.
Kasus 3 -Apa jika saya masih perlu menyimpan status objek referensi? (Misalnya, objek alamat)
Jika Anda menandai alamatnya sebagai sementara selama proses deepertine, itu akan mengembalikan hasil nol. Tetapi jika Anda masih perlu menyimpan keadaannya, Anda perlu membuat serial objek alamat. Serialisasi Java menyediakan mekanisme.
Karyawan.java:
paket org.arpit.javapostsforning; alamat; ;} Public string getDepapartment () {return department;} public void setDepartment (string department)} alamat publik getAddress () {return address;} public void setaddress (alamat alamat) {this.address = alamat;} private void writeObject (ObjectOutputStream OS) melempar IoException, ClassNotFoundException {try {os.defaultwriteObject (); ;}} Private Void ReadObject (ObjectInputStream) melempar ioExcetion foundException {try {is.defaultreadObject (); .ReadObject ();
Hal lain yang perlu diingat, ObjectInputStream membaca urutan data dari ObjectOutputStream.
Buat alamat.java
Alamat.java:
Paket org.arpit.javapostsforning; = Street; city = city;} public int gethomeno () {return homeno;} public void sethomeno (int homeno) {this.homeno = public string getStreet () {return street;} public void setstreet (string street) { This.street = street;} public String getCity () {return city;} public void setCity (string city) {this.city = city;
Buat serializedeserializemain.java
Serializedeserializemain.java:
Paket org.arpit.javapostsforning; Mandliya */ public static Main (String [] args) {karyawan emp = karyawan baru (); 88, MG Road "," Pune "); tutup ();} catch (ioException i) {i.printstacktrace ();} /deserialize emp = l; (Karyawan) di.reamObject (); Karyawan Deserialized ... "); System .out.println (" emp ID: " + emp.geteMeMeadeeId ()); System.out.println (" Nama: " + emp.geteMeadeeName ()); mp.getDepartment () );
berlari:
Saat Anda menjalankan SerializedeserializeMain.java.
Deserialized Emblayee ... emp ID: 101Name: ArpitDepartemen: CScity: Pune
Sekarang kita mendapatkan keadaan objek alamat, sama seperti itu sebelum diserialisasi.
Warisan dalam serialisasi:
Sekarang mari kita lihat bagaimana warisan mempengaruhi serialisasi. Terlepas dari apakah kelas induk diserialisasi, ini akan mengarah pada banyak contoh. Jika kelas induk tidak berseri, apa yang akan kita lakukan dan cara kerjanya. Mari kita lihat contohnya.
Kami akan menciptakan seseorang. Java sebagai kelas orang tua dari karyawan.
Kasus 4: Jika kelas induk diserialisasi
Jika kelas induk dapat membuat serial, semua kelas warisan akan diserialisasi.
Kasus 5: Bagaimana jika kelas induk tidak diserialisasi?
Jika kelas induk tidak terisialisasi, metode pemrosesan kami akan sangat berbeda.
Jika kelas induk tidak terisialisasi, maka ia tidak boleh memiliki fungsi konstruktor parameter.
Orang.java
Paket org.arpit.javapostsforning; Super (); ;} Public void setNationality (string nationality) {this.nationality = nationality;}}
Buat karyawan.java
Karyawan.java:
Paket org.arpit.javapostsforning; .employeeid = karyawan; departemen;} public void setDeppartment (string department) {this.deppartment = department;}}
Buat serializedeserializemain.java
Serializedeserializemain.java:
Paket org.arpit.javapostsforning; Mandliya */Public Static Main (String [] args) {// Serialize karyawan emp = karyawan baru (101, "Arpit", "India"); .println ("emp ID:" + emp.geteMireID ()); getDeppartment ()); ); *********** ");) ;; coba {fileInputStream filein = new fileInputStream (" employeeEE.ser ");) in.readObject (); in.close (); filein.close () ; "Setelah serial"); "Departemen:" + emp.getDeppartment ());
berlari:
Saat Anda menjalankan serializedeserializeMain.java, Anda akan mendapatkan output berikut. Jika kelas induk tidak diserialisasi, maka semua nilai variabel instance yang diwarisi dalam kelas induk akan disebut fungsi diinisialisasi. Di sini nama diwarisi secara langsung, jadi selama proses deepery, nama akan diinisialisasi ke nilai default.
Kasus 6 -Jika kelas induknya serial, tetapi Anda tidak perlu mewarisi kelas sebagai serial
Jika Anda tidak ingin mewarisi kelas untuk membuat serial, maka Anda perlu mengimplementasikan metode writeObject () dan readObject (), dan perlu membuang kelainan notserializable exception.
Kasus 7 -Dapatkah variabel statis membuat serial?
tidak bisa. Karena variabel statis adalah tingkat kelas, bukan tingkat objek.
Meringkaskan: