Java - Serialisasi
Java menyediakan mekanisme yang disebut serialisasi objek di mana sebuah objek dapat direpresentasikan sebagai urutan byte yang menyertakan data objek serta informasi tentang tipe objek dan tipe data yang disimpan dalam objek.
Setelah objek berseri telah ditulis ke dalam file, itu dapat dibaca dari file dan deserialisasi yaitu, informasi jenis dan byte yang mewakili objek dan datanya dapat digunakan untuk membuat ulang objek dalam memori.
Yang paling mengesankan adalah bahwa seluruh proses adalah JVM independen, yang berarti sebuah objek dapat diserialkan pada satu platform dan dideserialisasi pada platform yang sama sekali berbeda.
Kelas ObjectInputStream dan ObjectOutputStream adalah aliran tingkat tinggi yang berisi metode untuk membuat serial dan deserialisasi objek.
Kelas ObjectOutputStream berisi banyak metode tulis untuk menulis berbagai tipe data, tetapi satu metode yang menonjol -
public final void writeObject(Object x) throws IOException
Metode di atas membuat serial Objek dan mengirimkannya ke aliran keluaran. Demikian pula, kelas ObjectInputStream berisi metode berikut untuk deserialisasi objek -
public final Object readObject() throws IOException, ClassNotFoundException
Metode ini mengambil Objek berikutnya dari aliran dan deserialisasinya. Nilai yang dikembalikan adalah Object, jadi Anda perlu mentransmisikannya ke tipe data yang sesuai.
Untuk mendemonstrasikan cara kerja serialisasi di Java, saya akan menggunakan kelas Karyawan yang telah kita diskusikan di awal 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("Mailing a check to " + name + " " + address);
}
}
Perhatikan bahwa agar kelas berhasil diserialisasi, dua kondisi harus dipenuhi -
Kelas harus mengimplementasikan antarmuka java.io.Serializable.
Semua bidang di kelas harus dapat bersambung. Jika sebuah field tidak dapat diserialkan, itu harus ditandaitransient.
Jika Anda penasaran untuk mengetahui apakah Kelas Standar Java dapat diserialkan atau tidak, periksa dokumentasi untuk kelas tersebut. Tesnya sederhana: Jika kelas mengimplementasikan java.io.Serializable, maka itu dapat diserialisasi; jika tidak, tidak.
Membuat Serial Objek
Kelas ObjectOutputStream digunakan untuk membuat serial Object. Program SerializeDemo berikut membuat instance objek Karyawan dan membuat serialisasi menjadi file.
Ketika program selesai dijalankan, sebuah file bernama employee.ser dibuat. Program tidak menghasilkan keluaran apa pun, tetapi mempelajari kodenya dan mencoba menentukan apa yang sedang dilakukan program.
Note - Saat membuat serialisasi objek ke file, konvensi standar di Java adalah memberikan file a .ser perpanjangan.
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("Serialized data is saved in /tmp/employee.ser");
} catch (IOException i) {
i.printStackTrace();
}
}
}
Deserialisasi Objek
Program DeserializeDemo berikut deserialisasi objek Karyawan yang dibuat di program SerializeDemo. Pelajari program dan coba tentukan hasilnya -
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("Employee class not found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Employee...");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
}
}
Ini akan menghasilkan hasil sebagai berikut -
Keluaran
Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101
Berikut adalah poin penting yang harus diperhatikan -
Blok coba / tangkap mencoba menangkap ClassNotFoundException, yang dideklarasikan oleh metode readObject (). Agar JVM dapat melakukan deserialisasi objek, JVM harus dapat menemukan bytecode untuk kelas tersebut. Jika JVM tidak dapat menemukan kelas selama deserialisasi objek, maka ClassNotFoundException akan dilontarkan.
Perhatikan bahwa nilai kembalian readObject () dimasukkan ke referensi Karyawan.
Nilai bidang SSN adalah 11122333 saat objek diserialisasi, tetapi karena bidang tersebut bersifat sementara, nilai ini tidak dikirim ke aliran keluaran. Bidang SSN dari objek Karyawan deserialisasi adalah 0.