The Importance of Sharing

Java Serialization


Pada tulisan saya kali ini, saya akan membahas mengenai serialization pada java. Serialization merupakan suatu proses dimana state daripada objek tersebut dapat kita simpan menjadi bentuk deretan byte, dan juga sebaliknya. Pada pemrograman java semua objek yang dibuat, akan tersimpan atau tetap running, selama Java Virtual Machine atau JVM masih running. Artinya jika jvm mati, secara otomatis objek juga akan terhapus dari memori. Selain itu, objek pada java jika sudah lama tidak digunakan, akan terhapus secara otomatis oleh garbage collector java. Sehingga kita harus menyimpan state objek tersebut ke suatu tempat jika ingin digunakan kembali. Nah, salah satu teknik yang bisa digunakan  adalah Serialization tersebut. Objek akan disimpan dalam bentuk deretan byte ke dalam sebuah file atau database, dan juga bisa dikirim melalui jaringan. Salah  satu syarat supaya objek bisa diserializable adalah dengan mengimplements java.io.Serializable interface. Interface ini merupakan interface kosongan karena hanya berfungsi sebagai penanda bahwa class yang mengimplements interface tersebut bisa diserializable.

Sebagai contoh saya mempunyai sebuah Class Mahasiswa yang akan saya simpan ke dalam sebuah file bernama “mahasiswa.ser”. Class Mahasiswa ini harus mengimplements java.io.Serializable supaya bisa kita simpan statenya kedalam file. Sebagai catatan, penamaan sebuah file untuk serialization biasanya harus berekstensi “*.ser”.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package arya.serialization;

import java.io.Serializable;

/**
 *
 * @author bandenk
 */
public class Mahasiswa implements Serializable{
private String nim;
private String nama;
private String jurusan;
private transient int umur;

    public String getJurusan() {
        return jurusan;
    }

    public void setJurusan(String jurusan) {
        this.jurusan = jurusan;
    }

    public String getNama() {
        return nama;
    }

    public void setNama(String nama) {
        this.nama = nama;
    }

    public String getNim() {
        return nim;
    }

    public void setNim(String nim) {
        this.nim = nim;
    }

    public int getUmur() {
        return umur;
    }

    public void setUmur(int umur) {
        this.umur = umur;
    }

    public void cetakData(){
        System.out.println("NIM : " + getNim());
        System.out.println("Nama : " + getNama());
        System.out.println("Jurusan : " + getJurusan());
        System.out.println("Umur : " + getUmur());
    }
}

Anda bisa lihat pada class tersebut saya mengimplements interface java.io.Serializable, namun tidak satupun method yang harus saya override karena interface tersebut memang interface kosong (Marker Interface). Pada class tersebut, pada saat kita melakukan serialization, yang disimpan hanyalah state daripada properti class tersebut. Method ataupun constructor didalamnya tidak akan disimpan. Jika ada porperti yang tidak ingin disimpan atau diserialized maka kita harus menambahkan kata kunci “transient”. Itu bisa dilihat pada baris ke- 18 dimana properti umur saya tambahkan kata kunci transient. Hal ini mengakibatkan properti umur statenya tidak akan  disimpan. Sebagai tambahan, tidak semua objek di java mengimplements java.io.Serializable, namun untuk objek tertentu seperti swing, AWT, String dan Array, sudah mengimplements serializable. Nah, untuk menyimpannnya ke dalam sebuah file kodenya adalah sebagai berikut.

/*
 * To change this template, choose Tool
<pre>wraplines="false"</pre>
s | Templates
 * and open the template in the editor.
 */
package arya;

import arya.serialization.Mahasiswa;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 *
 * @author bandenk
 */
public class UjiSerialize {

 public static void main(String[] args) {
 Mahasiswa mahasiswa = new Mahasiswa();
 mahasiswa.setNim("07410100133");
 mahasiswa.setNama("I Gede Arya Wiratama");
 mahasiswa.setJurusan("Sistem Informasi");
 mahasiswa.setUmur(22);
 mahasiswa.cetakData();
 //Serialized Object
 try{
 FileOutputStream outputStream = new FileOutputStream("mahasiswa.ser");
 ObjectOutputStream stream = new ObjectOutputStream(outputStream);
 stream.writeObject(mahasiswa);
 stream.close();
 outputStream.close();
 }catch(IOException exception){
 }

 System.out.println();

 //Deserialization Object
 System.out.println("Deserialized Object....");
 try{
 FileInputStream inputStream = new FileInputStream("mahasiswa.ser");
 ObjectInputStream stream = new ObjectInputStream(inputStream);
 Mahasiswa mhs = (Mahasiswa) stream.readObject();
 mhs.cetakData();
 stream.close();
 inputStream.close();
 }catch(IOException exception){

 }catch(ClassNotFoundException exception){

 }
 }
}

Pada kode diatas untuk menyimpan state objek tersebut ke dalam sebuah file, saya menggunakan class ObjectOutputStream untuk mengubah state objek tersebut kedalam deretan byte dan menyimpannya kedalam file “mahasiswa.ser”. Untuk mengembalikan state objek dari file atau deretan byte kembali lagi menjadi sebuah objek. Kita bisa menggunakan class ObjectInputStream dan memanggil method readObject() pada baris 46. Namun kita harus melakukan casting terlebih dahulu. Jika sudah selesai, kita compile dulu kedua class tersebut lalu kita running. Maka hasilnya seperti gambar dibawah ini.

 

 

 

 

 

Perhatikan gambar diatas, pada saat proses deserializaed file menjadi objek, state daripada properti umur tidak disimpan. Karena telah saya beri kata kunci transient, sehingga menghasilkan nilai 0. Kemudian kita lihat pada project kita, akan ada sebuah file yang muncul, seperti gambar dibawah ini.

 

 

Pada kasus tertentu kita sudah menyimpan objek kita, lalu terjadilah perubahan pada objek tersebut. Misalnya kita ingin menambahkan sebuah field baru. Maka yang terjadi pada saat kita melakukan deserialization adalah sebuah error yaitu berupa InvalidClassException. Untuk menanggulanginya kita perlu memodifkasi kode kita, dengan menambahkan SerialVersionUID. Pada Netbeans, pada saat kita membuat class Mahasiswa kita tidak akan mendapatkan peringatan bahwa kita tidak menggunakan serialVersionID. Berbeda dengan Eclipse yang begitu kita mengimplements java.io.Serializable maka akan muncul peringatan untuk menggunakan serialVersionUID.

Supaya netbeans mau memberikan peringatan, maka kita dapat memodifikasinya dengan memberikan centang pada Standard Javac Warning yang terdapat pada Tools–>Option–>Editor–>Hints. Maka secara defaults netbenas akan memberikan peringatan pada kita mengenai serialVersionUID. Secara default netbeans akan memberikan UID bertipe Long bernilai 1L. Jika kita ingin menggunakan UID yang tidak default, anda bisa membuat sendiri atau menggunakan plugin yang terdapat pada situs berikut ini :

http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=6887.

Dibawah ini adalah contoh daripada SerialVersionUID hasil generate pada netbeans versi 6.9.1.

private static final long serialVersionUID = 2674877277149083221L;

Itulah sedikit hal yang bisa saya bagikan kepada anda. Semoga bermanfaat bagi kita semua.
Untuk source code diatas bisa didownload pada situs ini

Referensi :

  1. http://download.oracle.com/javase/1.3/docs/api/java/io/Serializable.html
  2. http://java.sun.com/developer/technicalArticles/Programming/serialization/

Comments on: "Java Serialization" (2)

  1. woi,,engken kabare??
    add rge :
    FB ; dewa sim
    twitt : @dewa_sim

    be di bali ne??

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: