Belajar Java – Menyimpan Data dengan Serialisasi

By | January 15, 2021
2,674 Views

Sinopsis

Format penyimpanan data yang tersediaa saat ini dan bersifat terbuka sangat banyak seperti XML; CSV; JSON kalaupun berbasis table bisa menggunakan SQlite, Postgres SQL, Mysql, SQL. Tapi kalau bekerja dengan cepat dan hanya digunakan untuk bahasa yang sama serta berbasis binary seperti kalian ingin menyimpan sebuah model pelatihan machine learning dengan banyak keluaran/output seperti array dalam banyak dimensinya, maka kalian perlu pertimbangkan menggunakan teknik serialisasi. Serialisasi merupakan fitur yang banyak diadopsi oleh banyak bahasa pemrograman termasuk java yaitu menyimpan sebuah object dalam sebuah file dalam mode binary!

Implementasi

Java menggunakan interface Serializable  untuk menandakan bahwa class tersebut bersifat serialisasi, karena berbentuk interface maka bisa digunakan bebarengan dengan inheritance dari class yang lain. Untuk mempermudah hal tersebut kalian gunakan teknik POJO plain old java object yang berupa setter dan getter. Dimana setter berfungsi untuk memberikan sebuah nilai dan getter untuk mendapatkan nilai. Misalkan kita mempunyai sebuah class dengan nama DataPerhitungan.java yang berfungsi untuk menyimpan sebuah array dari hasil keluaran proses pelatihan machine learning berupa bobot hidden dan bobot output.

Oiya untuk membedakan dengan extension yang sudah ada di Windows/Linux  maka extension yang digunakan *.serial (bebas sih kalian mau menggunakan extension apa saja koq), jangan lupa tetap menggunakan Constructor tapi dikosongkan saja body nya tanpa statement apapun pada class DataPerhitungan.java

import java.io.Serializable;

/**
 *
 * @author www.softscients.com
 */
public class DataPerhitungan implements Serializable{
    private double [][] bobotHidden;
    private double [][] bobotOutput;

    public DataPerhitungan ()
    {
        //constructor dibuat kosong saja
    }
    public DataPerhitungan(double [][] hidden, double [][]output)
    {
        this.bobotHidden = hidden;
        this.bobotOutput = output;
    }

    public double[][] getBobotHidden() {
        return bobotHidden;
    }

    public void setBobotHidden(double[][] bobotHidden) {
        this.bobotHidden = bobotHidden;
    }
    
    public double[][] getBobotOutput() {
        return bobotOutput;
    }
    
    public void setBobotOutput(double[][] bobotOutput) {
        this.bobotOutput = bobotOutput;
    }
    
}

Setelah kalian membuat class berbentuk POJO diatas, kita akan coba seperti berikut dibawah ini yang terdiri dari operasi menyimpan dan membaca kembali file tersebut. Mari kita implementasi untuk operasi tulis dan baca seperti berikut yang menggunakan 3 method yaitu simpan, baca, tampil

import java.io.*;
/**
 *
 * @author www.softscients.com
 */
public class DemoSerialisasi {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
            DemoSerialisasi.simpan(new File("D:/data.serial"));
            DemoSerialisasi.baca(new File("D:/data.serial"));
    }

    public static void simpan(File file)
    {
        System.out.println("File disimpan di : "+file.getAbsolutePath());
        double [][] hidden = new double [][]{{1,2,3},{4,5,6}};
        double [][] output = new double [][]{{7,8,9},{10,11,12}};
        DataPerhitungan data = new DataPerhitungan();
        data.setBobotHidden(hidden);
        data.setBobotOutput(output);
        FileOutputStream fos = null;
        ObjectOutputStream out = null;
        try {
            fos = new FileOutputStream(file.getAbsolutePath());
            out = new ObjectOutputStream(fos);
            out.writeObject(data); //class disimpan
            out.close();
        } catch(IOException ex) {
            ex.printStackTrace();
        }
    }
    public static void baca(File file )
    {
        System.out.println("Buka disimpan di : "+file.getAbsolutePath());
        DataPerhitungan data = new DataPerhitungan();
        
        FileInputStream fis=null;
        ObjectInputStream in=null;
        try {
            fis=new FileInputStream(file.getAbsolutePath());
            in =new ObjectInputStream(fis);
            try {
                data =  (DataPerhitungan) in.readObject(); //casting data
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }
            in.close();
        }catch(IOException ex) {
            ex.printStackTrace();
        }
        DemoSerialisasi.tampil(data);
        
    }
    public static void tampil(DataPerhitungan data)
    {
        
        //menampilkan hidden
        System.out.println("Bobot Hidden");
        for(int i=0;i<data.getBobotHidden().length;i++)
        {
            for(int j=0;j<data.getBobotHidden()[0].length;j++)
            {
                System.out.print(data.getBobotHidden()[i][j]+"\t");
            }
            System.out.println("");
        }
        //menampilkan output
        System.out.println("Bobot Output");
        for(int i=0;i<data.getBobotOutput().length;i++)
        {
            for(int j=0;j<data.getBobotOutput()[0].length;j++)
            {
                System.out.print(data.getBobotOutput()[i][j]+"\t");
            }
            System.out.println("");
        }
        
    }
    
}

Hasil keluaran dari serialisasi yaitu

File disimpan di : D:\data.serial
Buka disimpan di : D:\data.serial
Bobot Hidden
1.0	2.0	3.0	
4.0	5.0	6.0	
Bobot Output
7.0	8.0	9.0	
10.0	11.0	12.0

Dengan teknik tersebut kalian bisa menyimpanan apapun tidak hanya array saja! Alangkah lebih baik kalian harus menggunakan class yang implementasi dari Serializable seperti cara diatas