Serialisasi Objek Java: Menyimpan dan Memulihkan Objek
Java menyediakan mekanisme, yang disebut serialisasi objek di mana suatu objek dapat direpresentasikan sebagai urutan byte yang mencakup data objek serta informasi tentang tipe objek dan tipe data yang disimpan dalam objek.
Setelah objek yang diserialkan ditulis ke berkas, ia dapat dibaca dari berkas dan dideserialkan, yaitu informasi tipe dan byte yang mewakili objek dan datanya dapat digunakan untuk mewujudkan objek kembali di memori.
Yang paling mengesankan adalah seluruh proses independen JVM, artinya objek dapat diserialkan di satu platform dan dideserialkan di platform yang sama sekali berbeda.
Kelas ObjectInputStream dan ObjectOutputStream adalah aliran tingkat tinggi yang berisi metode untuk menyiasatkan dan dideserialisasi objek.
Kelas ObjectOutputStream berisi banyak metode write untuk menulis berbagai tipe data, tetapi satu metode khusus yang menonjol:
public final void writeObject(Object x) throws IOException
Metode di atas menyiasatkan Objek dan mengirimkannya ke aliran output. Sebaliknya, kelas ObjectInputStream berisi metode berikut untuk dideserialisasi objek:
public final Object readObject() throws IOException, ClassNotFoundException
Metode ini mengambil Objek berikutnya dari aliran dan dideserialkan. Nilai pengembalian adalah Object, jadi Anda perlu me-cast-nya ke tipe data yang sesuai.
Untuk menunjukkan cara kerja serialisasi di Java, saya akan menggunakan kelas Employee yang kita bahas sebelumnya dalam buku ini. Misalkan kita memiliki kelas Employee berikut, yang mengimplementasikan antarmuka Serializable:
Contoh
public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; public void mailCheck() { System.out.println("Mengirim cek ke " + name + " " + address); } } Perhatikan bahwa agar suatu kelas dapat diserialkan dengan sukses, dua kondisi harus terpenuhi:
Kelas harus mengimplementasikan antarmuka java.io.Serializable.
Semua bidang dalam kelas harus dapat diserialkan. Jika suatu bidang tidak dapat diserialkan, harus ditandai transient.
Jika Anda ingin tahu apakah Kelas Standar Java dapat diserialkan atau tidak, periksa dokumentasi kelas. Tesnya sederhana: Jika kelas mengimplementasikan java.io.Serializable, maka dapat diserialkan; jika tidak, tidak dapat.
Mengserialisasi Objek
Kelas ObjectOutputStream digunakan untuk menyiasatkan Objek. Program SerializeDemo berikut membuat objek Employee dan menyiasatkannya ke berkas.
Setelah program selesai dieksekusi, berkas bernama employee.ser dibuat. Program tidak menghasilkan output apa pun, tetapi pelajari kode dan coba tentukan apa yang dilakukan program.
Catatan – Saat menyiasatkan objek ke berkas, konvensi standar di Java adalah memberikan berkas ekstensi .ser.
Contoh
import java.io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Data yang disimpan disimpan di /tmp/employee.ser"); } catch (IOException i) { i.printStackTrace(); } } } Mengembalikan Objek
Program DeserializeDemo berikut mengembalikan objek Employee yang dibuat dalam program SerializeDemo. Pelajari program dan coba tentukan keluaran:
Contoh
import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); } catch (IOException i) { i.printStackTrace(); return; } catch (ClassNotFoundException c) { System.out.println("Kelas Employee tidak ditemukan"); c.printStackTrace(); return; } System.out.println("Employee yang dikembalikan..."); System.out.println("Nama: " + e.name); System.out.println("Alamat: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Nomor: " + e.number); } } Ini akan menghasilkan hasil berikut:
Keluaran
Employee yang dikembalikan... Nama: Reyan Ali Alamat:Phokka Kuan, Ambehta Peer SSN: 0 Nomor:101
Berikut adalah beberapa poin penting yang perlu diperhatikan:
Blok try/cast mencoba menangkap ClassNotFoundException, yang dideklarasikan oleh metode readObject(). Untuk JVM dapat mengembalikan objek, harus dapat menemukan kode byte untuk kelas. Jika JVM tidak dapat menemukan kelas selama pengembalian objek, ia melempar ClassNotFoundException.
Perhatikan bahwa nilai pengembalian readObject() di-cast ke referensi Employee.
Nilai bidang SSN adalah 11122333 saat objek disiasatkan, tetapi karena bidang ini transient, nilai ini tidak dikirim ke aliran output. Bidang SSN dari objek Employee yang dikembalikan adalah 0.