프로그래밍 언어/JAVA

[개요] Java 직렬화(Serialization) 이해

투칼론 2015. 3. 10. 23:16
반응형

자바 직렬화(Java Serialization)는 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것을 말한다. 반대로 스트림에서 데이터를 읽어 객체로 변환하는 것을 역직렬화(deserialization)라 한다.


객체를 파일에 저장하거나 파일에서 꺼내오기 위해서 또는 객체를 네트워크를 통해 전송하기 위해서는 미리 객체를 직렬화(Serialization) 해야한다.


아래 예제는 SerializeDemo.java에서 Serializable한 Employee 클래스를 직렬화 하고, DeserializeDemo.java에서 역직렬화하는 예제이다.



1. java.io.Serializable interface를 상속받은 클래스를 생성한다. 아래에서 transient의 의미는 직렬화시에 제외시킴을 선언한 의미이다.

[Employee.java]

public class Employee implements java.io.Serializable
{
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + name
                           + " " + address);
   }
}


2. 위에서 선언한 클래스 객체를 파일에 writeObject한다. 이때 위에서 Serializable을 상속하지 않았다면, writeObject에서 오류(java.io.NotSerializableException)가 발생할 것이다.

[SerializeDemo.java]

import java.io.*;

public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      try
      {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      }catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}


3. 파일에서 readObject를 사용하여 객체를 읽으면, writeObject한 값이 제대로 가져오는지를 확인한다.

[DeserializeDemo.java]

import java.io.*;
public class DeserializeDemo
{
   public static void main(String [] args)
   {
      Employee e = null;
      try
      {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i)
      {
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c)
      {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
    }
}


DeserializeDemo를 실행하면 아래와 같은 결과를 볼 수 있다. 아래에서 SSN이 0인 이유는 transient를 통해서 직렬화를 제외시켰기 때문이다.

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101


[글참조] http://www.tutorialspoint.com/java/java_serialization.htm