직렬화(Serialization)와 역직렬화(Deserialization)는 데이터 저장 및 전송을 위한 중요한 개념이다.
직렬화 (Serialization)
직렬화는 객체 상태를 저장 또는 전송하기 위해 일련의 바이트 형태로 변환하는 과정이다. 이를 통해 데이터는 파일로 저장되거나 네트워크를 통해 전송될 수 있다. 다양한 프로그래밍 언어와 프레임워크에서 직렬화 기법을 제공한다.
주요 목적
- 데이터 저장: 객체를 파일이나 데이터베이스에 저장할 수 있다.
- 데이터 전송: 네트워크를 통해 객체를 전송할 수 있다.
- 복제: 객체의 깊은 복사를 쉽게 수행할 수 있다.
직렬화 포맷
- 이진(Binary) 포맷: 빠르고 효율적이다. 예: Java의
ObjectOutputStream
, Python의pickle
- 텍스트(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)
역직렬화는 직렬화된 데이터를 원래 객체로 복원하는 과정이다. 이를 통해 저장된 파일이나 네트워크를 통해 수신된 데이터를 다시 객체로 변환할 수 있다.
주요 목적
- 데이터 복원: 저장된 데이터나 전송된 데이터를 다시 객체로 변환할 수 있다.
- 데이터 읽기: 파일이나 데이터베이스에서 읽은 데이터를 객체로 변환할 수 있다.
직렬화 예제 (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