Artikel Terbaru

3 Kondisi Object Serialisasi Terhadap Inheritance pada Java

Serialisasi adalah mekanisme untuk mengkonversi state dari object menjadi byte stream. Deserialisasi adalah kebalikan dari proses dimana byte stream akan digunakan untuk membuat ulang object Java yang sesungguhnya pada memori. Mekanisme ini digunakan untuk mempertahankan object pada program Java.

Prasyarat pengetahuan : Serialisasi dan Deserialisasi pada Java beserta ContohInheritance pada Java

Beberapa Kasus Serialisasi yang Berhubungan dengan Inheritance
  • Satu, Jika superclass dapat dilakukan serialisasi maka subclass secara otomatis juga dapat dilakukan serialisasi. Jika superclass dapat dilakukan serialisasi, maka secara otomatis setiap subclass dapat dilakukan serialisasi. Karena itu, meskipun subclass tidak implement interface serialisasi dan jika superclass-nya implement serialisasi, maka dapat dilakukan serialisasi object subclass.

// Program Java

// mendemonstrasikan bahwa

// jika superclass serialisasi

// maka subclass secara

// otomatis juga dapat

// dilakukan serialisasi.

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

 

/* superclass A */

 

// implementasi Serialisasi

// interface.

class A implements Serializable

{

int i; 

// parameterisasi constructor.

public A(int i)

{this.i = i;}

}

 

/* subclass B */

 

// B class tidak implement

// Serialisasi interface.

class B extends A

{

int j; 

// parameterisasi constructor.

public B(int i, int j)

{super(i);

this.j = j;}

}

 

/* Driver class */

public class Test

{

public static void main(String[] args)

throws Exception{

B b1 = new B(10,20);

 

System.out.println("i = " 

+b1.i);

System.out.println("j = " 

+b1.j);

  

// Serialisasi B (subclass)

// object.

  

// menyimpan object ke dalam

// sebuah file.

FileOutputStream fos = new FileOutputStream("abc.ser");

ObjectOutputStream oos = new ObjectOutputStream(fos);

   

// method untuk serialisasi

// dari class B object.

oos.writeObject(b1);

   

/* closing streams */

oos.close();

fos.close();

   

System.out.println("Object"

+" telah diserialisasi");

  

// De-Serialisasi B (subclass)

// object.

  

// membaca object dari sebuah

// file.

FileInputStream fis = new FileInputStream("abc.ser");

ObjectInputStream ois = new ObjectInputStream(fis);

   

// method untuk de-serialisasi

// dari B class object.

B b2 = (B)ois.readObject();

   

/* closing streams */

ois.close();

fis.close();

   

System.out.println("Object"

+" telah dideserialisasi");

  

System.out.println("i = " 

+b2.i);

System.out.println("j = " 

+b2.j);}

}

Output:
i = 10
j = 20
Object telah diserialisasi
Object telah dideserialisasi
i = 10
j = 20

  • dua, Jika sebuah superclass tidak dapat melakukan serialisasi maka subclass tetap dapat melakukan serialisasi, meskipun superclass-nya tidak implement interface serialisasi, subclass tetap dapat melakukan serialisasi object jika subclass itu implement serialisasi interface. Jadi, untuk dapat melakukan serialisasi subclass object, maka superclass tidak perlu dilakukan serialisasi. 

Kondisi Class dapat Dilakukan Serialisasi Tetapi Superclass Tidak Dapat Dilakukan Serialisasi
  • pertama, Serialisasi, Pada saat dilakukan serialisasi, jika variabel instance diwariskan dari non serialisasi superclass, maka JVM akan mengacuhkan nilai asli dari variabel instance dan menyimpan nilai default dari file.
  • kedua, Deserialisasi, Pada saat dilakukan serialisasi, jika terdapat non serialisasi, maka JVM akan mengeksekusi instance control flow dalam superclass. Sehingga, untuk mengeksekusi instance control flow dalam sebuah class, maka JVM akan selalu memanggil constructor default yang tidak berargumen dari class tersebut. Sehingga, setiap superclass non serialisasi harus mengandung constructor default, jika tidak maka akan didapat runtime-exception.

// Program Java

// mendemonstrasikan kasus

// jika superclass tidak harus

// bisa serialisasi saat

// dilakukan proses

// serialisasi pada subclass.

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;;

 

/* superclass A */

 

// sebuah class tidak

// memerlukan implementasi

// serialisasi interface.

class A

{

int i;

 

// parameterisasi constructor.

public A(int i)

{this.i = i;}

 

/* default constructor */

 

// constructor ini harus

// ditampilkan, jika tidak

// maka akan didapati runtime

// exception.

public A()

{i = 50;

System.out.println("class"

+" constructor A dipanggil");}

}

 

/* subclass B */

 

// implementasi serialisasi

// interface.

class B extends A implements Serializable

{

int j;

 

// parameterisasi constructor.

public B(int i,int j)

{super(i);

this.j = j;}

}

 

/* Driver class */

public class Test

{

public static void main(String[] args)

throws Exception

{B b1 = new B(10,20);

  

System.out.println("i = " 

+b1.i);

System.out.println("j = " 

+b1.j);

  

// Serialisasi B (subclass)

// object.

  

// menyimpan object ke dalam

// sebuah file.

FileOutputStream fos = new FileOutputStream("abc.ser");

ObjectOutputStream oos = new ObjectOutputStream(fos);

   

// method untuk serilasisasi

// dari B class object.

oos.writeObject(b1);

   

/* closing streams */

oos.close();

fos.close();

   

System.out.println("Object"

+" telah diserialisasi");

  

// De-Serialisasi B (subclass)

// object.

  

// Membaca object dari sebuah

// file.

FileInputStream fis = new FileInputStream("abc.ser");

ObjectInputStream ois = new ObjectInputStream(fis);

   

// Method untuk de-serialisasi

// dari B class object.

B b2 = (B)ois.readObject();

   

/* closing streams */

ois.close();

fis.close();

   

System.out.println("Object"

+" telah dideserialisasi");

  

System.out.println("i = " 

+b2.i);

System.out.println("j = " 

+b2.j);

}

}

Output:
i = 10
j = 20
Object telah diserialisasi
class constructor A dipanggil
Object telah dideserialisasi
i = 0
j = 20

  • tiga, Jika superclass dapat dilakukan serialisasi tetapi tidak untuk subclass-nya, maka tidak ada cara langsung untuk mencegah subclass dari serialisasi pada Java. Satu cara yang mungkin adalah dimana seorang programmer dapat mencapainya dengan melakukan implementasi method writeObject() dan readObject() pada subclass dan perlu 'dilemparkan' NotSerializableException dari method tersebut. Method tersebut akan dieksekusi selama serialisasi dan deserialisasi dilakukan secara berurutan. Dengan overriding method-nya, dapat diimplementasikan dari costum serialisasi.

// Program Java

// mendemonstrasikan bagaiman

// cara mencegah subclass dari

// serialisasi.

import java.io.FileInputStream

import java.io.FileOutputStream

import java.io.IOException

import java.io.NotSerializableException

import java.io.ObjectInputStream

import java.io.ObjectOutputStream

import java.io.Serializable

 

/* superclass A */

 

// implementasi serialisasi

// interface.

class A implements Serializable 

int i; 

 

// parameterisasi constructor.

public A(int i

{this.i = i;} 

 

/* subclass B */

 

// class B tidak implement

// serialisasi interface.

class B extends

int j; 

 

// parameterisasi constructor.

public B(int i,int j

{super(i); 

this.j = j;} 

 

// dengan mengimplementasikan

// method writeObject, dapat

// dilakukan pencegahan

// subclass untuk melakukan 

// serialisasi.

private void writeObject(ObjectOutputStream out) throws IOException 

{throw new NotSerializableException();} 

 

// dengan mengimplementasikan

// method readObject, dapat

// dilakukan pencegahan

// subclass untuk melakukan

// deserialisasi.

private void readObject(ObjectInputStream in) throws IOException 

{throw new NotSerializableException();}  

 

/* Driver class */

public class Test 

public static void main(String[] args

throws Exception

B b1 = new B(10, 20); 

  

System.out.println("i = " 

+b1.i); 

System.out.println("j = " 

+b1.j); 

  

// Serialisasi B (subclass)

// object.

  

// menyimpan object dalam

// sebuah file.

FileOutputStream fos = new FileOutputStream("abc.ser"); 

ObjectOutputStream oos = new ObjectOutputStream(fos); 

   

// method untuk serialisasi

// dari object class B.

oos.writeObject(b1); 

   

/* closing streams */

oos.close(); 

fos.close(); 

   

System.out.println("Object telah diserialisasi"); 

  

// DeSerialisasi B (subclass)

// object.

  

// Membaca object dari sebuah

// file.

FileInputStream fis = new FileInputStream("abc.ser"); 

ObjectInputStream ois = new ObjectInputStream(fis); 

   

// method untuk de-serialisasi

// dari object class B.

B b2 = (B)ois.readObject(); 

   

/* closing streams */

ois.close(); 

fis.close(); 

   

System.out.println("Object"

+" telah dideserialisasi"); 

  

System.out.println("i = " 

+b2.i); 

System.out.println("j = " 

+b2.j);} 

}

Output:
i = 10
j = 20
Exception in thread "main" java.io.NotSerializableException
at B.writeObject(Test.java:44)

Komentar

  1. Apa fungsi serialisasi pada Java?

    BalasHapus
    Balasan
    1. Serialisasi pada Java memungkinkan user untuk melakukan perubahan object menjadi stream yang dapat dikirim melaui jaringan atau menyimpannya sebagai file atau database untuk digunakan nanti.

      Hapus
  2. Apa fungsi deserialisasi pada Java?

    BalasHapus
    Balasan
    1. Deserialisasi adalah proses mengubah aliran object atau stream object menjadi object Java yang sebenarnya untuk digunakan dalam suatu program.

      Hapus
  3. Serialisasi menyediakan cara dimana suatu object dapat direpresentasikan sebagai suatu urutan byte yang mencakup data dan informasi object yang memiliki tipe object dan tipe data yang disimpan dalam suatu object pada Java. Dimana object tersebut hanya dapat dibaca dari file setelah object serial ditulis ke dalam file.

    BalasHapus

Posting Komentar

Respon komentar 7 x 24 jam, so please be patient :D

Hot Artikel!!!

Enkapsulasi pada Java

6 Tahap Utama dalam Melakukan Kompilasi Program Hello World Java

6 Contoh Program Method Overloading pada Java