자바 직렬화

WAS·2025년 3월 24일
0

자바

목록 보기
31/31

직렬화

  • 객체를 바이트 스트림으로 변환하는 과정
  • 변환된 객체는 파일에 저장되거나 네트워크를 통해 다른 시스템으로 전송 가능

역직렬화직렬화 된 데이터를 다시 객체로 복원하는 과정

직렬화 과정은 객체를 파일에 저장하거나, 네트워크 통신을 하기 위해서 필요하다

그러면 직렬화 과정은 어떻게 할까?


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 객체를 읽어와서 원래 객체로 복원

profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글