직렬화 & 역직렬화

썩은요플렛's avatar
Aug 02, 2024
직렬화 & 역직렬화
 
직렬화(Serialization)와 역직렬화(Deserialization)는 데이터 저장 및 전송을 위한 중요한 개념이다.

직렬화 (Serialization)

직렬화는 객체 상태를 저장 또는 전송하기 위해 일련의 바이트 형태로 변환하는 과정이다. 이를 통해 데이터는 파일로 저장되거나 네트워크를 통해 전송될 수 있다. 다양한 프로그래밍 언어와 프레임워크에서 직렬화 기법을 제공한다.

주요 목적

  1. 데이터 저장: 객체를 파일이나 데이터베이스에 저장할 수 있다.
  1. 데이터 전송: 네트워크를 통해 객체를 전송할 수 있다.
  1. 복제: 객체의 깊은 복사를 쉽게 수행할 수 있다.

직렬화 포맷

  1. 이진(Binary) 포맷: 빠르고 효율적이다. 예: Java의 ObjectOutputStream, Python의 pickle
  1. 텍스트(Text) 포맷: 인간이 읽기 쉽고, 일반적으로 플랫폼 독립적이다. 예: JSON, XML

예시 (Java에서의 직렬화)

  • 직렬화할 클래스 작성
    • 먼저 직렬화할 객체가 되는 클래스를 작성해야 한다. 이 클래스는 Serializable 인터페이스를 구현해야 한다.
      java코드 복사 import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + '}'; } }
  • 객체를 파일로 직렬화
    • 다음으로 ObjectOutputStream을 사용하여 객체를 파일로 직렬화한다.
      java코드 복사 import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class SerializeExample { public static void main(String[] args) { Person person = new Person("John Doe", 30); try (FileOutputStream fileOut = new FileOutputStream("person.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut)) { out.writeObject(person); System.out.println("Serialized data is saved in person.ser"); } catch (IOException i) { i.printStackTrace(); } } }

역직렬화 (Deserialization)

역직렬화는 직렬화된 데이터를 원래 객체로 복원하는 과정이다. 이를 통해 저장된 파일이나 네트워크를 통해 수신된 데이터를 다시 객체로 변환할 수 있다.

주요 목적

  1. 데이터 복원: 저장된 데이터나 전송된 데이터를 다시 객체로 변환할 수 있다.
  1. 데이터 읽기: 파일이나 데이터베이스에서 읽은 데이터를 객체로 변환할 수 있다.

직렬화 예제 (SerializeExample.java)

java코드 복사 import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; class Person implements Serializable { private static final long serialVersionUID = 1L; String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + '}'; } } public class SerializeExample { public static void main(String[] args) { Person person = new Person("John Doe", 30); try (FileOutputStream fileOut = new FileOutputStream("person.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut)) { out.writeObject(person); System.out.println("Serialized data is saved in person.ser"); } catch (IOException i) { i.printStackTrace(); } } }

역직렬화 예제 (DeserializeExample.java)

java코드 복사 import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public class DeserializeExample { public static void main(String[] args) { Person person = null; try (FileInputStream fileIn = new FileInputStream("person.ser"); ObjectInputStream in = new ObjectInputStream(fileIn)) { person = (Person) in.readObject(); System.out.println("Deserialized Person..."); System.out.println("Name: " + person.name); System.out.println("Age: " + person.age); } catch (IOException i) { i.printStackTrace(); } catch (ClassNotFoundException c) { System.out.println("Person class not found"); c.printStackTrace(); } } }
 

직렬화와 역직렬화의 장단점

장점

  • 데이터 저장 및 전송의 용이성: 객체를 파일로 저장하거나 네트워크를 통해 쉽게 전송할 수 있다.
  • 상태 유지: 프로그램 종료 후에도 객체 상태를 유지할 수 있다.

단점

  • 포맷 비호환성: 서로 다른 시스템이나 언어 간에 포맷이 호환되지 않을 수 있다.
  • 보안 위험: 직렬화된 데이터는 조작될 수 있으며, 신뢰할 수 없는 데이터를 역직렬화하면 보안 문제가 발생할 수 있다.
  • 성능 문제: 대용량 데이터 직렬화 및 역직렬화는 성능에 영향을 미칠 수 있다.

결론

직렬화와 역직렬화는 데이터 저장 및 전송에 매우 유용한 기술이지만, 사용 시 포맷 호환성 및 보안 문제를 고려해야 한다. 다양한 프로그래밍 언어에서 지원하는 직렬화 라이브러리를 활용하여 효율적으로 데이터를 관리할 수 있다.
Share article

RottenYogurt's Development Blog