lottie
Seungjun's blog
blog
Serializable

Serializable란?

Serializable은 자바에서 제공하는 인터페이스 중 하나로, 객체의 직렬화(Serialization)와 역직렬화(Deserialization)를 지원하는 인터페이스입니다. 이 인터페이스를 구현한 클래스의 인스턴스는 객체의 상태를 일련의 바이트로 변환할 수 있습니다. 이렇게 변환된 바이트는 파일에 저장하거나 네트워크를 통해 전송되며, 나중에 다시 원래의 객체로 복원될 수 있습니다.


Serializable 인터페이스는 마커 인터페이스(marker interface)로도 알려져 있습니다. 이는 인터페이스 내부에 아무런 메서드가 선언되어 있지 않고, 단지 해당 인터페이스를 구현한 클래스가 특정한 동작을 지원한다는 사실을 나타내기 위한 용도로 사용됩니다.


주로 Serializable 인터페이스는 다음과 같은 상황에서 활용됩니다:


객체의 저장 및 전송: 객체의 상태를 파일에 저장하거나 네트워크를 통해 전송하기 위해 직렬화된 형태로 변환할 때 사용됩니다.


자바 직렬화 API: 자바에서는 ObjectOutputStream과 ObjectInputStream 클래스를 사용하여 객체를 직렬화하고 역직렬화할 수 있는 API를 제공합니다.


사용법

// 객체를 파일에 저장 (직렬화)
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.ser"))) {
    MySerializableObject obj = new MySerializableObject();
    oos.writeObject(obj);
} catch (IOException e) {
    e.printStackTrace();
}

// 파일에서 객체 읽어오기 (역직렬화)
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.ser"))) {
    MySerializableObject obj = (MySerializableObject) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

RMI(Remote Method Invocation):

원격에서 객체의 메서드를 호출할 때 객체는 직렬화되어 전송되며, 이때 Serializable 인터페이스가 사용됩니다.


주의사항:

Serializable 인터페이스를 구현하는 클래스는 모든 멤버 변수가 Serializable이어야 합니다. 만약 직렬화할 수 없는 멤버 변수가 있다면 transient 키워드를 사용하여 해당 변수를 제외시킬 수 있습니다.

직렬화는 보안적인 측면에서 주의가 필요하며, 민감한 정보를 직렬화할 때는 적절한 보안 조치를 고려해야 합니다.