English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 가이드

Java 흐름 제어

Java 배열

Java 동적 객체(I)

Java 동적 객체(II)

Java 동적 객체(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map 집합

Java Set 집합

Java 입력/출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 시리얼라이제이션

Java는 객체 시리얼라이즈 메커니즘을 제공하며, 이 메커니즘에서는 객체가 데이터의 바이트 시리얼로 표현될 수 있으며, 이 바이트 시리얼은 객체 데이터, 객체와 관련된 타입 정보, 객체 내 데이터 타입을 포함합니다。

시리얼라이즈된 객체를 파일에 쓰고 나면 파일에서 읽어서 역시리얼라이즈할 수 있으며, 객체의 타입 정보, 객체 데이터, 객체 내 데이터 타입을 사용하여 메모리에서 새 객체를 생성할 수 있습니다。

전체 과정은 Java 가상 머신(JVM) 독립적입니다. 즉, 하나의 플랫폼에서 시리얼라이즈된 객체는 완전히 다른 플랫폼에서 역시리얼라이즈될 수 있습니다。

ObjectInputStream과 ObjectOutputStream 클래스는 고차원 데이터 스트림으로, 객체를 시리얼라이즈하고 역시리얼라이즈하는 메서드를 포함하고 있습니다。

ObjectOutputStream 클래스는 다양한 데이터 타입을 쓰기 위해 많은 메서드를 포함하고 있지만, 특별한 메서드가 하나 있습니다:

public final void writeObject(Object x) throws IOException

위의 메서드는 객체를 시리얼라이즈하고 출력 스트림으로 보냅니다. 비슷한 ObjectInputStream 클래스는 다음과 같은 객체를 역시리얼라이즈하는 메서드를 포함하고 있습니다:

public final Object readObject() throws IOException, 
                                 ClassNotFoundException

이 메서드는 스트림에서 다음 객체를 꺼내어 객체를 역시리얼라이즈합니다. 반환 값은 Object이므로, 적절한 데이터 타입으로 변환해야 합니다.

Java에서 시리얼라이즈가 어떻게 작동하는지 보여주기 위해, 이전 강의에서 언급한 Employee 클래스를 사용하겠습니다. Employee 클래스는 Serializable 인터페이스를 구현한 것으로 가정합니다.

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);
   }
}

주의하세요, 클래스의 객체가 성공적으로 시리얼라이즈될 수 있는 경우, 두 가지 조건을 충족해야 합니다:

이 클래스는 java.io.Serializable 인터페이스를 구현해야 합니다.

이 클래스의 모든 속성은 시리얼라이즈 가능해야 합니다. 시리얼라이즈 가능하지 않은 속성이 있다면, 해당 속성은 임시로 표시되어야 합니다.

Java 표준 클래스가 시리얼라이즈 가능한지 알고 싶다면, 해당 클래스의 문서를 확인하세요. 클래스가 시리얼라이즈 가능한지 확인하는 방법은 간단합니다. 해당 클래스가 java.io.Serializable 인터페이스를 구현하고 있는지 확인하면 됩니다.

시리얼라이즈 객체

ObjectOutputStream 클래스는 객체를 시리얼라이즈하는 데 사용되며, SerializeDemo 인스턴스는 Employee 객체를 시리얼라이즈하여 파일에 저장합니다.

이 프로그램이 실행되면, employee.ser 파일이 생성됩니다. 이 프로그램은 어떤 출력도 하지 않지만, 코드를 분석하여 프로그램의 작용을 이해할 수 있습니다.

주의: 객체를 파일에 시리얼라이즈할 때, Java의 표준 규약에 따라 파일에 .ser 확장자를 부여합니다.

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();
      }
   }
}

역시리화된 객체

아래 DeserializeDemo 프로그램은 역시리화를 예제로 보여줍니다./tmp/employee.ser에 Employee 객체가 저장되어 있습니다.

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);
    }
}

위 프로그램의 컴파일 및 실행 결과는 다음과 같습니다:

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

이곳에서 주의해야 할 다음 사항을 확인하십시오:

readObject() 메서드의  try/catch 블록은 ClassNotFoundException 예외를 잡으려고 시도합니다. JVM이 객체를反시리얼라이제이션할 수 있는 경우, 반드시字节 코드를 찾을 수 있는 클래스여야 합니다. JVM이 객체를反시리얼라이제이션하는 과정에서 해당 클래스를 찾을 수 없다면 ClassNotFoundException 예외를 투げ뜁니다.

주의하십시오, readObject() 메서드의 반환 값은 Employee 참조로 변환됩니다.

객체가 시리얼라이제이션될 때, 속성 SSN의 값은 111222333그러나 이 속성이 일시적인 것이므로, 이 값은 출력 스트림으로 전송되지 않았습니다. 따라서反序列화된 Employee 객체의 SSN 속성은 0입니다.