serialVersionUID란 무엇인가?
serialVersionUID는 Java에서 직렬화(Serialization)된 객체의 버전을 식별하기 위해 사용되는 고유한 ID입니다. 이 값은 반드시 private static final long 타입의 변수로 선언해야 하며, 컴파일러가 클래스의 상태와 클래스 속성들을 기반으로 계산하여 생성합니다. JVM은 파일로부터 객체의 상태를 읽어들일 때 이 번호를 참조하여 해당 객체의 상태를 정확하게 식별합니다.
serialVersionUID의 핵심 역할
- 버전 호환성 검증: 역직렬화(Deserialization) 과정에서 serialVersionUID를 사용하여 직렬화된 객체의 송신자와 수신자가 로드한 클래스가 직렬화 관점에서 서로 호환되는지 확인합니다.
- 예외 발생 조건: 역직렬화하려는 객체의 클래스 구조가 직렬화 당시의 클래스와 다르다면 InvalidClassException이 발생할 수 있습니다.
- 기본값 자동 생성: serialVersionUID를 명시적으로 지정하지 않으면, 런타임이 클래스의 다양한 특성(클래스 이름, 인터페이스, 필드, 메서드 등)을 기반으로 기본 serialVersionUID 값을 자동으로 계산합니다.
💡 팁: 런타임이 계산한 기본값은 컴파일러 구현에 따라 달라질 수 있으므로, 클래스 변경 시 예기치 않은 InvalidClassException을 방기 위해서는 serialVersionUID를 명시적으로 선언하는 것이 좋습니다.
예제 코드
다음은 Employee 클래스에 serialVersionUID를 선언하고 객체를 직렬화하여 파일에 저장하는 예제입니다.
import java.io.*;
class Employee implements Serializable {
private static final long serialVersionUID = 5462223600l;
int empId;
String name;
String location;
Employee(int empId, String name, String location) {
this.empId = empId;
this.name = name;
this.location = location;
}
void empData() {
System.out.println("Employee Id is: "+ empId);
System.out.println("Employee Name is: "+ name);
System.out.println("Employee Location is: "+ location);
}
}
public class EmployeeTest {
public static void main(String[] args)throws Exception{
Employee emp = new Employee(115, "Raja", "Hyderabad");
emp.empData();
FileOutputStream fos = new FileOutputStream("E:\\Employee.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(emp);
System.out.println("Object Serialized");
}
}
실행 결과
Employee Id is: 115 Employee Name is: Raja Employee Location is: Hyderabad Object Serialized
정리
serialVersionUID는 Java 직렬화 메커니즘에서 객체의 버전 관리를 담당하는 중요한 요소입니다. 명시적으로 선언하면 클래스가 일부 수정되더라도 직렬화된 데이터와의 호환성을 개발자가 의도대로 제어할 수 있으며, 이를 통해 안정적인 객체 영속화와 분산 환경 간의 데이터 교환이 가능해집니다.