✅ 직렬화
역직렬화
는 직렬화
된 데이터를 다시 객체로 복원하는 과정
즉 직렬화
과정은 객체를 파일에 저장하거나, 네트워크 통신을 하기 위해서 필요하다
그러면 직렬화
과정은 어떻게 할까?
✅ Serializable
Serializable
인터페이스를 구현하면, 해당 클래스의 객체를 직렬화 할 수 있다implements Serializable
는 직렬화
가능한 객체임을 나타내는 표시자 인터페이스이다Serializable
을 구현하고 serialVersionUID
를 정의하면, 클래스의 객체를 안전하게 직렬화하고, 버전 호환성 문제를 방지할 수 있다
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
}
✅ serialVersionUID
직렬화
와 관련된 버전 관리를 위한 고유 식별자serialVersionUID
라는 값을 사용직렬화
한 후 나중에 같은 클래스를 역직렬화
할 때 클래스의 버전이 일치하는지 확인직렬화
된 객체의 클래스 버전이 변경 또는 클래스 구조가 달라지면 역직렬화
시 문제 발생즉 serialVersionUID
는 버전 호환성을 체크하는 데 사용
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
// serialVersionUID를 명시적으로 설정
private static final long serialVersionUID = 1L; // 클래스의 버전 1을 나타냄
// 만약 클래스를 수정하고 버전이 달라졌다면, serialVersionUID를 변경해야함
}
만약에 serialVersionUID
를 명시하지 않으면, 자바가 자동으로 serialVersionUID
를 생성하는데,
이 값은 클래스가 변경될 때마다 달라질 수 있다
serialVersionUID
를 사용하지 않으면, 자바는 내부적으로 버전을 추적할 수 없고
역직렬화
시 문제가 발생할 수 있다
✅ 직렬화
예시
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class SerializationExample {
public static void main(String[] args) {
try {
// 직렬화: 객체를 파일에 저장
Person person = new Person("John Doe", 30);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"));
out.writeObject(person); // 객체를 직렬화하여 저장
out.close();
System.out.println("객체가 직렬화되어 파일에 저장되었습니다.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
위 예제에서 Person 클래스의 객체를 직렬화하여 pserson.per 파일에 저장한다
✅ 역직렬화
예시
import java.io.Serializable;
import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.IOException;
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Name: " + name + ", Age: " + age;
}
}
public class DeserializationExample {
public static void main(String[] args) {
try {
// 역직렬화: 직렬화된 파일에서 객체를 읽어옴
ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"));
Person person = (Person) in.readObject(); // 직렬화된 객체를 읽어서 복원
in.close();
System.out.println("복원된 객체: " + person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
위 예제에서는 person.per 파일에서 직렬화된 Person 객체를 읽어와서 원래 객체로 복원