Object Serialization

Serializable secara teori didefinisikan sebagai “Mengubah sebuah object menjadi barisan bit sedemikian rupa sehingga object tersebut dapat disimpan ke dalam secondary memory.”

Di Java, agar sebuah kelas dapat diserialisasi, maka kelas itu harus mengimplementjava.io.Serializable untuk memberitahu Java Virtual Machine bahwa instans-instans dari kelas ini dapat diserialisasi dan disimpan di dalam secondary memory such sebagai file atau lebih jauh lagi, dikirim via jaringan.

Beberapa hal yang perlu anda ketahui tentang object serialization:

  1. Security
    Isu penting dalam serialisasi adalah sekuriti. Karena, ketika sebuah objek diserialisasi, objek tersebut menjadi barisan bit-bit yang tersimpan dalam sebuah file biner. Jika seseorang dapat mengakses file tersebut (yang merupakan hasil serialisasi) dan memanipulasi bit-bit itu, maka objek-objek anda telah di-hack dan hal ini dapat dilakukan dengan mudah karena access modifier apapun tidak akan berpengaruh lagi :D
  2. State dari suatu objek
    Satu hal yang perlu dipertimbangkan ketika men-serialisasi suatu objek adalah state dari objek tersebut. Banyak objek berubah menurut waktu dan ada juga objek-objek yang sangat dependent kepada environment-nya. Sebagai contoh, sebuah object dari kelas Thread biasanya berubah dari waktu ke waktu dan sebuah object dari kelas Socket sangat spesifik terhadap workstation tertentu pada waktu tertentu. Berdasarkan inilah, maka Java memutuskan untuk membiarkan anda menentukan kelas mana yang boleh diserialisasi dan mana yang tidak.
  3. Keyword Static
    Hal tricky yang harus anda pertimbangkan ketika memutuskan apakah harus mengimplement interface Serializable atau tidak adalah keyword static. Sekarang perhatikan baik-baik kelas java.lang.Math!! Kelas ini tidak tergantung waktu dan juga tidak tergantung mesin ataupun JVM, tetapi kelas ini tidak serializable. Kenapa? Karena semua fitur yang ditawarkan oleh kelas Math diberi tanda static yang berarti bahwa fitur-fitur tersebut akan di-load ke dalam JVM pada saat kompilasi. Hal ini berarti kelas tersebut tidak perlu diserialisasi. Jadi, jika suatu kelas hanya memiliki method private atau static, kemungkinan besar kelas tersebut tidak perlu mengimplement interface Serializable.
  4. Transient
    Hal terakhir yang perlu diketahui ketika mendesain suatu kelas yang serializable adlah keyword Transient. Field manapun yang dideklarasikan sebagai transient akan di-skip oleh JVM ketika JVM menserialisasi objek dari kelas tersebut.

Bagaimana jika kelas saya memiliki object reference(s)? Apakah JVM men-serialisasi mereka juga? Jawabannya adalah Ya. Selama object reference tersebut adalah reference yang menuju ke object yang serialisable, dan anda tidak memberikan keyword transient di sekitarnya, maka JVM akan men-serialisasi objek-objek yang direfer tersebut. :D

Hal lain yang menarik dalam serialisasi adalah field statik yang bernama serialVersionUID. Field ini merepresentasikan versi dari kelas. Artinya, kita tidak bisa me-load suatu objek jika serialVersionUID dari objek tersebut berbeda dengan serialVersionUID yang anda punya. Walaupun objek tersebut datang dari kelas yang sama, JVM akan menghalangi anda untuk me-load suatu serialized object ketika JVM mengetahui bahwa serialVersionUID-nya berbeda. Catatlah bahwa anda tidak perlu mengganti serialVersionUID jika anda hanya mengganti method-method atau field-field static. Ubahlah nilai serialVersionUID hanya jika anda mengubah field-field non-static pada objek tersebut.

Apakah nilai serialVersionUID acak? Tidak. Yah.. sebenarnya, anda dapat saja memberikan nilai yang anda inginkan tapi itu tidak baik karena serialVersionUID yang anda berikan mungkin saja sudah dipakai oleh kelas lain. Sangat dianjurkan untuk meng-generate nilai serialVersionUID dari IDE yang anda pakai seperti Eclipse, Netbeans atau JDeveloper.

public class SerializableObject implements Serializable{
private static final long serialVersionUID = -6849794470754337710L;
}

Sumber : http://hjaya.wordpress.com/2008/11/29/object-serialization/