본문 바로가기

자바

직렬화 / 역직렬화 - 자바

직렬화 - Serialization

  • 자바의 상태를 바이트 스트림으로 변환하는 것
  • 자바 객체를 정적인 바이트 스트림으로 변환하는 것 - 파일 / 데이터베이스에 저장하거나 네트워크를 통해 전송 가능

바이트 스트림(byte stream)

  • 컴퓨터에서 데이터를 읽고 쓸 수 있는데 사용하는 기본 방식

직렬화 장점

  • 객체 저장 - 객체를 파일로 저장하거나 네트워크를 통해 전송할 수 있음
  • 객체 전송 - 네트워크를 통해 전송할 수 있어, 다른 컴퓨터나 애플리케이션과 객체 공유 가능
  • 객체 복원 - 직렬화된 객체는 복원할 수 있어, 객체의 상태를 유지할 수 있음
  • 분산 환경 - RMI(Remote Method Invocation)나 EJB(Enterprise JavaBeans)를 사용하는 분산 환경에서 사용 가능

직렬화 단점

  • 보안 - 네트워크를 통해 전송될 때 보안이 취약할 수 있음
  • 성능 - 직렬화에는 성능 비용이 발생할 수 있고 직렬화된 개체의 크기도 증가할 수 있음
  • 버전관리 - 클래스의 정의가 변경될때 호환되지 않아 이전 버전과의 호환성 유지가 어려움
  • 사용제한 - 직렬화는 자바 클래스를 기반으로 하는 객체만 직렬화하고 데이터 구조나 원시 유형과 같은 다른 유형은 직렬화하지 않는다.
  • 장황함 - 객체의 직렬화된 형태는 상당히 장황할 수 있고 많은 공간을 차지할 수 있으므로 네트워크를 통해 전송하거나 메모리에 저장하는 것이 어렵다.

 

예시

  • 직렬화
class Person implements Serializable {
    private String name;
    private int age;
    //getter and setter and toString
}

 

public class Serializable {
  public static void main(String[] args) {
    // 객체 선언
    Person person = new Person("David",10);
    
    //자바 7 이전 버전 try-catch-final
    FileOutputStream fileOut = null;
    ObjectOutputStream out = null;
    
    try {  
      fileOut = new FileOutputStream("person.txt");
      out = new ObjectOutputStream(fileOut);

      out.writeObject(person);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (fileOut != null) {
        try {
          fileOut.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }

      if (out != null) {
        try {
          out.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    
    // 자바 7 이후 try-catch-resource문
    try (
      // 여기서 선언한건 사용이 끝나면 닫아줌
      FileOutputStream fileOut = new FileOutputStream("person.txt");
      ObjectOutputStream out = new ObjectOutputStream(fileOut);
    ) {
      out.writeObject(person);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

바이트 코드라서 속 내용은 읽은 수 없는 문자로 되어있음

 

  • 역직렬화
public class Deserializable {
  public static void main(String[] args) {
    try {
      FileInputStream fileIn = new FileInputStream("person.txt");
      ObjectInputStream in = new ObjectInputStream(fileIn);
      Person person = (Person) in.readObject();
      in.close();
      fileIn.close();
      System.out.println(person);
    } catch (IOException | ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

저장된 객체를 가져와서 사용(출력)

 

 

 

참고

https://roadmap.sh/java/

https://devlog-wjdrbs96.tistory.com/268

'자바' 카테고리의 다른 글

클래스 Class  (0) 2023.01.29
자바 이미지 크롭  (0) 2023.01.26
가비지 컬렉션  (0) 2023.01.24
List Map Set  (0) 2022.10.19
자바  (0) 2021.12.31