Post

(TIL) 2025-01-06

(TIL) 2025-01-06

직렬화와 역직렬화


직렬화(Serialization)역직렬화(Deserialization)는 데이터를 효율적으로 저장하거나 전송하기 위해 데이터를 변환하고 다시 복원하는 과정을 말한다.

직렬화

정의

객체나 데이터를 연속적인 바이트(stream) 형태로 변환하는 과정.

목적

데이터 저장 또는 네트워크를 통한 전송.

사용 사례

  • 데이터를 파일로 저장
  • API 통신에서 JSON 또는 XML로 데이터 변환
  • 데이터베이스에 객체를 저장

예시 코드(Javascript)

1
2
3
4
5
6
7
8
// 객체 정의
const data = { name: "Alice", age: 25, hobbies: ["reading", "traveling"] };

// JSON 문자열로 변환 (직렬화)
const serializedData = JSON.stringify(data);

console.log(serializedData);
// 출력: '{"name":"Alice","age":25,"hobbies":["reading","traveling"]}'

역직렬화

정의

직렬화된 데이터를 원래 객체로 복원하는 과정.

목적

저장된 데이터나 네트워크로 전달받은 데이터를 다시 사용 가능하도록 변환.

사용 사례

  • 파일에서 데이터를 읽어와 객체로 변환
  • JSON 문자열을 객체로 변환하여 코드에서 사용

예시 코드(Javascript)

1
2
3
4
5
6
7
8
9
10
11
12
// JSON 문자열
const jsonString =
  '{"name":"Alice","age":25,"hobbies":["reading","traveling"]}';

// 객체로 변환 (역직렬화)
const deserializedData = JSON.parse(jsonString);

console.log(deserializedData);
// 출력: { name: 'Alice', age: 25, hobbies: [ 'reading', 'traveling' ] }

// 개별 속성 접근
console.log(deserializedData.name); // 출력: Alice

주요 포인트

직렬화 포맷

  • JSON, XML, Protocol Buffers, Avro, BSON 등

장점:

  • 데이터를 효율적으로 저장 및 전송
  • 언어 간 데이터 공유 가능(JSON은 Python, Java, JS 모두 호환 가능)

주의점:

  • 버전 불일치: Java 같은 언어에서는 클래스 변경 시 이전 직렬화 데이터 호환성이 깨질 수 있음
  • 보안: 역직렬화 시 악의적인 데이터(예: 코드 주입)로부터 보호 필요

흐름

직렬화

객체 → 직렬화 → 파일/네트워크 전송/저장

역직렬화:

파일/네트워크에서 가져온 직렬화 데이터 → 역직렬화 → 객체

사용 예시

  • 웹 개발: 클라이언트와 서버 간 JSON 데이터 교환
  • 데이터베이스: ORM에서 객체 저장
  • 네트워크 통신: API 호출
  • 분산 시스템: 시스템 간 데이터 교환(Hadoop, Kafka 등)

기타 예시 코드

파일과 직렬화/역직렬화

직렬화 후 파일에 저장

1
2
3
4
5
6
7
8
const fs = require("fs");

// 데이터 객체
const data = { name: "Alice", age: 25, hobbies: ["reading", "traveling"] };

// 직렬화하여 파일에 저장
fs.writeFileSync("data.json", JSON.stringify(data));
console.log("Data saved to file.");

파일에서 읽어와 역직렬화

1
2
3
4
5
6
7
8
// 파일에서 JSON 읽기
const fileContent = fs.readFileSync("data.json", "utf8");

// 역직렬화
const deserializedData = JSON.parse(fileContent);

console.log(deserializedData);
// 출력: { name: 'Alice', age: 25, hobbies: [ 'reading', 'traveling' ] }

네트워크와 직렬화/역직렬화

Fetch API를 사용한 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 데이터 객체
const data = { name: "Alice", age: 25 };

// 서버로 데이터 전송
fetch("https://example.com/api", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(data), // 직렬화
})
  .then((response) => response.json()) // 응답 데이터를 역직렬화
  .then((responseData) => {
    console.log(responseData); // 출력: 서버에서 받은 JSON 객체
  })
  .catch((error) => console.error("Error:", error));
This post is licensed under CC BY 4.0 by the author.