สนับสนุนโดย

วันพฤหัสบดีที่ 27 ธันวาคม พ.ศ. 2561

Serialization and Cloning

ในการเขียนข้อมูลต่างๆ ลงไปแบบ Binary Data เราต้องทำการ implements Serialization เสมอ ทีนี้บางกรณีหากเราต้องการคัดลอก หรือเรียกกันว่า โคลนนิ่ง จะทำได้อย่างไร ตรงนี้มีประโยชน์มาก เมื่อเราต้องการสร้างข้อมูลใหม่ แต่เก็บรักษาข้อมูลเก่าไว้ด้วย เพื่อไม่ให้เกิดการสูญหาย และกำหนดเป็น version ได้ตามต้องการ

ลองมาดูตัวอย่างกันครับ ให้ทำการสร้าง package ชื่อว่า serialClone ขึ้นมาก่อน แล้วสร้างไฟล์ SerialCloneTest.java ใส่เข้าไป พร้อมกับเขียนโค้ดดังนี้


package serialClone;

import java.io.*;
import java.util.*;

public class SerialCloneTest {

    public static void main(String[] args) {
        Employee harry = new Employee("Harry Hacker", 35000, 1989, 10, 1);
        // clone harry
        Employee harry2 = (Employee) harry.clone();

        // mutate harry
        harry.raiseSalary(10);

        // now harry and the clone are different
        System.out.println(harry);
        System.out.println(harry2);
    }
}

class SerialCloneable implements Cloneable, Serializable {

    public Object clone() {
        try {
            // save the object to a byte array
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bout);
            out.writeObject(this);
            out.close();

            // read a clone of the object from the byte array
            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
            ObjectInputStream in = new ObjectInputStream(bin);
            Object ret = in.readObject();
            in.close();

            return ret;
        } catch (Exception e) {
            return null;
        }
    }
}

class Employee extends SerialCloneable {

    private String name;
    private double salary;
    private Date hireDay;

    public Employee(String n, double s, int year, int month, int day) {
        name = n;
        salary = s;
        GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
        hireDay = calendar.getTime();
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }

    public Date getHireDay() {
        return hireDay;
    }

    public void raiseSalary(double byPercent) {
        double raise = salary * byPercent / 100;
        salary += raise;
    }

    public String toString() {
        return getClass().getName()
                + "[name=" + name
                + ",salary=" + salary
                + ",hireDay=" + hireDay
                + "]";
    }
}

ผลการทำงาน
serialClone.Employee[name=Harry Hacker,salary=38500.0,hireDay=Sun Oct 01 00:00:00 ICT 1989]
serialClone.Employee[name=Harry Hacker,salary=35000.0,hireDay=Sun Oct 01 00:00:00 ICT 1989]

ไม่มีความคิดเห็น:

แสดงความคิดเห็น