본문 바로가기
Programming/Java

Java Serialization(직렬화)란 무엇일까?

by BACKK0M 2019. 4. 12.
반응형

이번 포스팅에서는 Java 언어의 Serialization에 대해 알아보고자 합니다.

 

 

Serialization(직렬화)란?

 

 Java에서 Serialization(직렬화)란 Object(객체)를 저장 또는 전송을 위해 Java code를 복원 가능한 byte stream 형태로 변환시키는 것을 말합니다.

 Object가 기존의 상태로 복원되기 위해선 Object 내부 data들의 reference가 잘 정의되어 있어야 하는데, 이는 Serialization을 통한 Object graph를 형성하여 이를 이용한 Object 복원이 이루어지게 됩니다.

 

 Java에서 Object가 안전하게 Serialization 되기 위해서는 해당 class에 Serializable Interface를 implements 해주어야 합니다. 그리고 serialVersionUID를 생성해주어야 합니다. UID는 역직렬화 할 때 이 값이 맞는지 확인하고 맞을 경우 처리가 이루어집니다. 즉, 직렬화 할 때의 UID와 역직렬화 할 때의 UID가 같아야 합니다.

 

 역직렬화는 직렬화된 File 등을 역으로 직렬화하여 다시 Object 형태로 만드는 것을 의미합니다. 지정된 파일을 읽거나 전송된 stream data를 읽어 원래의 객체 형태로 복원하게 됩니다.

 

Serialization 과정

 

Object ------------------------------------- byte stream ------------------------------------- Object
                      marshaling                                              unmarshaling

 

 Object를 byte stream으로 바꾸는 과정을 marshaling, 반대로 byte stream을 Object로 바꾸는 것을 unmarshaling 이라 합니다.

 

Serialization 예제

 

 아래는 간단한 예제입니다. 학생 클래스에는 이름, 학번, 학년이 저장되고, 10개의 학생 데이터를 리스트에 저장합니다. 저장된 결과를 출력하고 직렬화를 진행합니다. 그 후 리스트를 초기화 하고 역직렬화를 하여 얻은 데이터를 리스트가 갖도록 합니다. 직렬화 전 데이터와 역직렬화 후 얻은 데이터를 비교하는 예제입니다.

 

* Student.java

package example_1;

import java.io.Serializable;

public class Student implements Serializable{

    /**

     * Serializable class

     */

    private static final long serialVersionUID = -4254178208400167033L;

    private String name;

    private int stu_num;

    private int grade;

    

    public Student(String name, int stu_num, int grade) {

        this.name = name;

        this.stu_num = stu_num;

        this.grade = grade;

    }

    

    @Override

    public String toString() {

        return "[Name: " + name +", Student number: " + stu_num 

                + ", grade: " + grade + "]";

    }

}

* SerializationTest.java

package example_1;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.LinkedList;

public class SerializationTest {

    @SuppressWarnings("unchecked")

    public static void main(String[] args) {

        

        LinkedList<Student> list = new LinkedList<Student>();

        for (int i=1; i<=10; i++) {

            Student std = new Student("student"+i, i, (i%4)+1);

            list.add(std);

        }

        System.out.println("직렬화 전 데이터");

        for (Student s : list)

            System.out.println(s);

        System.out.println(list.size());

        System.out.println("====================구분선====================="); // 구분선

        

        /*

         * Serialization

         */

        try {

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

            BufferedOutputStream bos = new BufferedOutputStream(fos);

            ObjectOutputStream out = new ObjectOutputStream(bos);

            

            out.writeObject(list);

            out.close();

        } catch (FileNotFoundException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        

        list.clear();

        System.out.println("직렬화 후 리스트 초기화");

        System.out.println(list);

        System.out.println(list.size());

        System.out.println("====================구분선====================="); // 구분선

        

        /*

         * Deserialization

         */

        

        try{ 

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

            BufferedInputStream bis = new BufferedInputStream(fis);

            ObjectInputStream in = new ObjectInputStream(bis);

            

            list = (LinkedList<Student>) in.readObject();

            

            in.close();

        } catch (FileNotFoundException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (ClassNotFoundException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } 

        

        System.out.println("역직렬화 후 데이터");

        for (Student s : list)

            System.out.println(s);

        System.out.println(list.size());

    }

}

* 출력 결과

 

SerializationTest 실행 결과

 

반응형