산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

자바 객체 직렬화: 객체 영속화와 복원

자바는 객체 직렬화(object serialization)라는 메커니즘을 제공합니다. 여기서 객체는 객체의 데이터뿐만 아니라 객체 타입과 객체에 저장된 데이터 타입들에 대한 정보를 포함하는 바이트 시퀀스로 표현될 수 있습니다.

직렬화된 객체가 파일에 쓰여진 후, 파일에서 읽어와 역직렬화(deserialized)할 수 있습니다. 즉, 타입 정보와 객체 및 데이터를 나타내는 바이트들을 사용하여 메모리에서 객체를 재생성할 수 있습니다.

가장 인상적인 점은 이 전체 과정이 JVM 독립적이라는 것입니다. 즉, 한 플랫폼에서 객체를 직렬화하고 완전히 다른 플랫폼에서 역직렬화할 수 있습니다.

ObjectInputStream과 ObjectOutputStream 클래스는 객체 직렬화와 역직렬화를 위한 메서드들을 포함하는 고수준 스트림들입니다.

ObjectOutputStream 클래스에는 다양한 데이터 타입을 쓰기 위한 많은 write 메서드들이 있지만, 특히 눈에 띄는 메서드가 하나 있습니다.


public final void writeObject(Object x) throws IOException

위 메서드는 객체를 직렬화하여 출력 스트림으로 보냅니다. 마찬가지로 ObjectInputStream 클래스에는 객체 역직렬화를 위한 다음 메서드가 있습니다.


public final Object readObject() throws IOException, ClassNotFoundException

이 메서드는 스트림에서 다음 Object를 꺼내 역직렬화합니다. 반환 값이 Object이므로 적절한 데이터 타입으로 캐스팅해야 합니다.

자바에서 직렬화가 어떻게 작동하는지 시연하기 위해 앞서 책에서 다룬 Employee 클래스를 사용하겠습니다. 다음 Employee 클래스가 Serializable 인터페이스를 구현한다고 가정해 보겠습니다.

예제: 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을 구현하면 직렬화 가능하고, 아니면 불가능합니다.

객체 직렬화(Serializing an Object)

ObjectOutputStream 클래스를 사용하여 객체를 직렬화합니다. 다음 SerializeDemo 프로그램은 Employee 객체를 인스턴스화하여 파일에 직렬화합니다.

프로그램 실행 완료 시 employee.ser라는 파일이 생성됩니다. 프로그램은 출력을 생성하지 않지만 코드를 연구하여 프로그램이 무엇을 하는지 파악해 보세요.

참고 - 객체를 파일에 직렬화할 때 자바의 표준 관례는 파일에 .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();
        }
    }
}

객체 역직렬화(Deserializing an Object)

다음 DeserializeDemo 프로그램은 SerializeDemo 프로그램에서 생성된 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

다음 중요한 점들에 유의하세요.

java

  1. Java final 키워드 마스터: 변수, 메서드, 클래스에서의 활용
  2. Java instanceof 연산자 완벽 가이드: 기본 사용법부터 상속, 인터페이스까지
  3. Java 정적 중첩 클래스 이해: 용법, 내부 클래스와의 차이, 예제
  4. Java 익명 내부 클래스 마스터: 정의, 문법, 실전 예제
  5. Java 싱글톤 패턴 완벽 가이드: 안전하게 구현하고 사용하기
  6. Java 리플렉션 마스터: 런타임에 클래스, 메서드, 필드 검사 및 조작
  7. Java ObjectOutputStream 마스터하기: 직렬화, 메서드, 실전 예제
  8. Java 제네릭 마스터하기: 재사용 가능하고 타입 안전한 코드 작성
  9. java.io로 Java 파일 작업 마스터하기 – 생성, 읽기, 쓰기 및 삭제
  10. Java 마스터하기: 객체, 클래스, 핵심 OOP 개념 이해