자바 직렬화(Serialization)란?

신수정·2024년 4월 12일

직렬화란?

객체의 상태를 저장하거나 네트워크를 통해 전송하기 위해 바이트 스트림으로 변환하는 과정입니다. 자바에서는 Serializable 인터페이스를 구현함으로써 객체가 직렬화될 수 있도록 허용합니다. 이 인터페이스를 구현하는 객체들은 자바의 ObjectOutputStream을 통해 쉽게 저장되거나 네트워크를 통해 전송될 수 있습니다.

직렬화를 하는 이유

1. 데이터 저장: 객체의 현재 상태를 파일 시스템 등에 저장하여 나중에 다시 사용할 수 있게 합니다.
  1. 네트워크 통신: 객체를 하나의 위치에서 다른 위치로 네트워크를 통해 전송할 때 사용합니다. 예를 들어, 서버와 클라이언트 간의 객체 교환 시 유용합니다.

  2. 분산 객체: RMI(Remote Method Invocation)와 같은 기술에서 메서드 호출 시 인자나 반환 값으로 객체를 사용할 때 직렬화가 필요합니다.

직렬화를 하지 않으면?

객체 직렬화를 구현하지 않고 객체의 상태를 저장하거나 전송하려고 시도할 경우 NotSerializableException 에러가 발생합니다. 이는 자바 시스템이 객체를 안전하게 바이트 스트림으로 변환할 수 없음을 의미합니다. 따라서, 객체의 영속성이나 객체 기반 통신이 필요한 어플리케이션에서는 직렬화가 반드시 필요합니다.

다음은 자바에서 Serializable 인터페이스를 구현하여 간단한 객체 직렬화와 역직렬화를 수행하는 예제 코드입니다.

import java.io.*;

// 직렬화가 가능하도록 Serializable 인터페이스 구현
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private transient String password;  // transient 키워드는 직렬화에서 이 필드를 제외

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public static void main(String[] args) {
        User user = new User("John Doe", "123456");

        // 객체를 파일에 직렬화
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"))) {
            oos.writeObject(user);
            System.out.println("Object has been serialized");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 파일에서 객체를 역직렬화
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"))) {
            User deserializedUser = (User) ois.readObject();
            System.out.println("Object has been deserialized");
            System.out.println("Name: " + deserializedUser.name);
            // 비밀번호는 transient이므로 null이 출력됩니다.
            System.out.println("Password: " + deserializedUser.password);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

이 예제에서는 User 클래스의 인스턴스를 직렬화하여 파일에 저장하고, 나중에 이 파일에서 객체를 역직렬화하여 복원합니다. transient 키워드가 사용된 password 필드는 직렬화 과정에서 제외되어, 역직렬화할 때 null 값으로 복원됩니다. 이는 민감한 정보를 직렬화 데이터에 포함시키고 싶지 않을 때 유용합니다.

이처럼 직렬화는 객체의 영속성과 네트워크 기반 통신에서 중요한 역할을 하며, 올바르게 사용될 때 강력한 도구가 될 수 있습니다.

profile
안녕하세요:)

0개의 댓글