JAVA/포스팅

자바 직렬화 Serializable

짜집퍼박사(짜박) 2023. 11. 26. 22:58

Serializable은 자바 직렬화의 기능을 활성화하기 위한 마커 인터페이스입니다. 마커 인터페이스란 메서드가 없고, 단지 해당 클래스나 인터페이스를 구현한 클래스에 대한 정보를 제공하는 역할을 합니다. Serializable 인터페이스를 구현한 클래스는 해당 객체의 인스턴스 상태를 직렬화할 수 있도록 허용됩니다.

 

1. Serializable 인터페이스 사용

클래스가 Serializable 인터페이스를 구현하면, 해당 클래스의 인스턴스는 직렬화 및 역직렬화가 가능해집니다. 직렬화는 객체를 바이트 스트림으로 변환하는 프로세스이고, 역직렬화는 바이트 스트림에서 객체를 복원하는 프로세스입니다.

import java.io.*;

// Serializable 인터페이스를 구현한 클래스
class MyClass implements Serializable {
    private static final long serialVersionUID = 1L; // 직렬화 버전 UID
    private int intValue;
    private String stringValue;

    // 생성자, 메서드 등 클래스의 내용
    // ...
}

 

2. 직렬화 버전 UID

serialVersionUID는 클래스의 직렬화 버전 UID(Unique Identifier)를 나타냅니다. 이 UID는 클래스의 구조가 변경되었을 때 역직렬화에서 사용되며, 객체를 직렬화할 때 클래스 버전을 식별하는 데 사용됩니다. 클래스가 변경되면 serialVersionUID를 명시적으로 지정해주는 것이 좋습니다. 그렇지 않으면 컴파일러가 자동으로 생성하게 되는데, 이는 클래스의 구조가 바뀔 때마다 변경되므로 버전 관리가 어려워집니다.

private static final long serialVersionUID = 1L;

 

3. 직렬화 및 역직렬화

클래스가 Serializable을 구현한 경우, 해당 클래스의 인스턴스는 ObjectOutputStream을 사용하여 직렬화하고, ObjectInputStream을 사용하여 역직렬화할 수 있습니다.

 

4. 직렬화 예제

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.ser"))) {
    MyClass obj = new MyClass();
    oos.writeObject(obj);
} catch (IOException e) {
    e.printStackTrace();
}

 

5. 역직렬화 예제

try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.ser"))) {
    MyClass obj = (MyClass) ois.readObject();
    // 역직렬화된 객체를 사용하는 로직
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

 

6. 주의사항

- 직렬화 가능한 필드: 직렬화할 수 있는 객체는 해당 객체 내의 모든 필드가 직렬화 가능해야 합니다. 만약 직렬화할 필요가 없는 필드가 있다면 transient 키워드를 사용하여 제외할 수 있습니다.

private transient int nonSerializableField;

- 직렬화 메서드 사용자 정의: 클래스에 특별한 직렬화 로직이 필요한 경우 writeObject 및 readObject 메서드를 사용자 정의할 수 있습니다.

private void writeObject(ObjectOutputStream out) throws IOException {
    out.defaultWriteObject(); // 기본 필드들을 직렬화
    // 추가적인 직렬화 로직
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject(); // 기본 필드들을 역직렬화
    // 추가적인 역직렬화 로직
}

- 버전 관리: 클래스의 구조가 변경되면 직렬화 버전 UID를 명시적으로 관리하여 버전 관리에 유의해야 합니다. 클래스의 변경에 따라 UID를 업데이트하여 버전 충돌을 방지합니다.

 

With ChatGPT

'JAVA > 포스팅' 카테고리의 다른 글

자바 네트워킹(Networking)  (0) 2023.11.27
자바 직렬화 transient  (0) 2023.11.27
자바 ObjectOutputStream  (0) 2023.11.26
자바 ObjectInputStream  (0) 2023.11.26
자바 직렬화(Serialization)  (0) 2023.11.26