네트워크 통신: 객체를 하나의 위치에서 다른 위치로 네트워크를 통해 전송할 때 사용합니다. 예를 들어, 서버와 클라이언트 간의 객체 교환 시 유용합니다.
분산 객체: RMI(Remote Method Invocation)와 같은 기술에서 메서드 호출 시 인자나 반환 값으로 객체를 사용할 때 직렬화가 필요합니다.
다음은 자바에서 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 값으로 복원됩니다. 이는 민감한 정보를 직렬화 데이터에 포함시키고 싶지 않을 때 유용합니다.
이처럼 직렬화는 객체의 영속성과 네트워크 기반 통신에서 중요한 역할을 하며, 올바르게 사용될 때 강력한 도구가 될 수 있습니다.