Java - 직렬화 예제 (Serialization, Deserialization, Serializable)

직렬화, Serialization은 네트워크 또는 파일로 자바 객체를 전달하기 위하여 byte stream으로 변환하는 것을 말합니다.

즉, Serialization(직렬화)는 Object를 bytes로, Deserialization(역직렬화)는 bytes를 Object로 변환합니다.

Serializable

Serializable 인터페이스를 구현한 클래스의 객체만 직렬화할 수 있습니다.

다음과 같이 클래스를 정의할 때 implements로 구현만 하면 됩니다.

public class Student implements Serializable {
    private String name;
    private int id;

    Student(String name, int id) {
        this.name = name;
        this.id = id;
    }

    @Override
    public String toString() {
        return "name : " + name + ", id : " + id;
    }
}

Serialization (직렬화) / Deserialization (역직렬화)

다음 코드는 Student 객체를 직렬화하여 파일에 저장하고, 파일에 저장된 bytes로부터 역직렬화하여 다시 객체로 만드는 예제입니다.

import java.io.*;

public class SerializationExample {

    public static void main(String[] args) throws Exception {

        Student student = new Student("JS", 123);

        // serialization
        File file = new File("./student.file");
        try (FileOutputStream fos = new FileOutputStream(file);
             ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(student);
            oos.flush();
        }

        // deserialization
        Student result = null;
        try (FileInputStream fis = new FileInputStream(file);
             ObjectInputStream ois = new ObjectInputStream(fis)) {
            result = (Student) ois.readObject();
        }

        System.out.println(result.toString());
    }

    public static class Student implements Serializable {
        private String name;
        private int id;

        Student(String name, int id) {
            this.name = name;
            this.id = id;
        }

        @Override
        public String toString() {
            return "name : " + name + ", id : " + id;
        }
    }
}

Output:

name : JS, id : 123

Serialization

Serialization 코드를 자세히 보면, ObjectOutputStream#writeObject()으로 bytes stream로 변환하며 이것을 File에 저장합니다.

File file = new File("./student.file");
try (FileOutputStream fos = new FileOutputStream(file);
     ObjectOutputStream oos = new ObjectOutputStream(fos)) {
    oos.writeObject(student);
    oos.flush();
}

Deserialization

Deserialization 코드를 자세히 보면, ObjectInputStream#readObject()으로 bytes stream을 Object로 변환합니다.

Student result = null;
try (FileInputStream fis = new FileInputStream(file);
     ObjectInputStream ois = new ObjectInputStream(fis)) {
    result = (Student) ois.readObject();
}

직렬화된 파일

위의 예제에서 student.file 이름의 파일에 직렬화된 bytes를 저장하였습니다.

이 파일을 Text 에디터에서 열어보면 이런식으로 보입니다.

�� sr SerializationExample$StudentA!
Ve�� I idL namet Ljava/lang/String;xp   {t JS
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha