ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 직렬화(Serialization)와 역직렬화(Deserialization)
    Computer Science/OS 2024. 4. 11. 10:01
    반응형

    직렬화와 역직렬화는 소프트웨어 개발에서 자주 마주치는 개념으로, 데이터를 효율적으로 저장하고 전송하는 데 필수적인 역할을 합니다. 

    1. 직렬화란?

     직렬화(Serialization)는 데이터 구조나 객체 상태를 저장하거나 전송할 수 있는 포맷(예: JSON, XML)으로 변환하는 과정을 말합니다. 이렇게 하면 메모리에 있는 객체를 파일 시스템, 데이터베이스, 또는 네트워크를 통해 전송 후에도 재구성할 수 있습니다.

    2. 역직렬화란?

     역직렬화(Deserialization)는 직렬화의 반대 과정으로, 데이터를 원래의 객체나 데이터 구조로 복구하는 과정을 의미합니다. 역직렬화를 통해 저장소나 네트워크를 통해 받은 데이터를 응용 프로그램에서 다시 사용할 수 있는 실제 객체로 변환할 수 있습니다.

    3. 어디에 주로 쓰이나요?

    • 네트워크 통신: 클라이언트와 서버 간의 데이터 전송에서 직렬화는 필수적입니다. 객체를 직렬화하여 네트워크를 통해 전송하고, 수신 측에서 해당 객체를 역직렬화하여 사용합니다.
    • 데이터 저장: 객체의 상태를 파일 시스템이나 데이터베이스에 저장할 때 사용합니다. 직렬화를 통해 객체를 바이트 스트림으로 변환하고, 이를 저장소에 기록합니다. 나중에 이 데이터를 읽어 역직렬화하여 원래의 객체 상태로 복원합니다.
    • 캐싱: 응용 프로그램의 성능 향상을 위해 자주 사용되는 데이터를 메모리에 캐싱할 때 직렬화가 사용될 수 있습니다. 캐싱된 데이터를 직렬화하여 효율적으로 저장하고, 필요할 때 빠르게 역직렬화하여 사용합니다.

    4. 직렬화와 역직렬화 예시

     직렬화와 역직렬화의 구현은 프로그래밍 언어와 사용되는 라이브러리에 따라 다를 수 있습니다. 여기 Java와 Go 언어를 사용하여 간단한 객체의 직렬화 및 역직렬화 방법을 소개합니다.

    Java에서의 직렬화와 역직렬화

     Java에서 객체를 직렬화하려면, 해당 객체의 클래스가 java.io.Serializable 인터페이스를 구현해야 합니다. 아래는 Person 객체를 직렬화하고 역직렬화하는 간단한 예시입니다.

     

    Person.java

    import java.io.Serializable;
    
    public class Person implements Serializable {
        private static final long serialVersionUID = 1L;
        private String name;
        private int age;
    
        // Constructor, Getters, Setters 생략
    }

     

    직렬화 예시

    import java.io.FileOutputStream;
    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("Object has been serialized");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

     

    역직렬화 예시

    import java.io.FileInputStream;
    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("Object has been deserialized");
                System.out.println("Name: " + person.getName() + ", Age: " + person.getAge());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

     

    Go에서의 직렬화와 역직렬화

    Go에서는 직렬화를 마샬링(Marshaling)이라고 하며, 표준 라이브러리인 encoding/json을 사용하여 JSON 포맷으로 직렬화 및 역직렬화를 수행할 수 있습니다.

     

    직렬화 및 역직렬화 예시

    package main
    
    import (
        "encoding/json"
        "fmt"
        "log"
    )
    
    type Person struct {
        Name string `json:"name"`
        Age  int    `json:"age"`
    }
    
    func main() {
        // 직렬화
        person := Person{"John Doe", 30}
        jsonData, err := json.Marshal(person)
        if err != nil {
            log.Fatalf("JSON Marshaling failed: %s", err)
        }
        fmt.Printf("Serialized data: %s\n", jsonData)
    
        // 역직렬화
        var person2 Person
        err = json.Unmarshal(jsonData, &person2)
        if err != nil {
            log.Fatalf("JSON Unmarshaling failed: %s", err)
        }
        fmt.Printf("Deserialized data: %+v\n", person2)
    }

     위 Java와 Go 예시에서 볼 수 있듯이, 두 언어 모두 객체를 바이트 스트림 형태로 직렬화하여 파일에 저장하거나 네트워크를 통해 전송할 수 있으며, 이후 이 바이트 스트림을 다시 객체로 역직렬화할 수 있습니다.

    5. 추가 팁

    • 보안 주의: 역직렬화 과정에서 악의적인 데이터가 주입될 가능성이 있으므로, 신뢰할 수 없는 소스로부터의 역직렬화는 매우 신중하게 처리해야 합니다.
    • 성능 고려: 직렬화와 역직렬화 과정은 비용이 발생하는 작업입니다. 크기가 큰 객체나 복잡한 객체 그래프를 직렬화/역직렬화할 때는 성능 저하를 고려해야 합니다.
    • 라이브러리 활용: 많은 프로그래밍 언어에서는 직렬화와 역직렬화를 지원하기 위한 라이브러리를 제공합니다. 예를 들어, Java에는 Serializable 인터페이스가 있고, Python에는 pickle 모듈이 있습니다. 적합한 라이브러리를 활용하여 작업을 간소화하고 표준화된 방식을 따르는 것이 좋습니다.

     직렬화와 역직렬화는 데이터를 효율적으로 전송하고 저장하는 데 중요한 역할을 합니다. 이 개념들을 잘 이해하고 적절하게 활용한다면, 소프트웨어 개발의 다양한 상황에서 유용하게 사용할 수 있을 것입니다.

    반응형
Designed by Tistory.