• Home
  • About
    • JOOS photo

      JOOS

      Joos's blog

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Serializer/ deserializer

16 Jun 2021

Reading time ~2 minutes

제 블로그의 모든 글은 IMHO로 쓴 것입니다. 서로에 대한 존중을 담은 덧글을 남겨 소통을 하신다면 더 좋은 글로 발전이 될 수 있을 것 같습니다. 존중이 담기지 않은 덧글은 언제든 삭제될 수 있습니다. 감사합니다:)
—

직렬화 / 역직렬화

  • 직렬화(Serialize)
    • 시스템 내부에서 사용되는 데이터를 외부의 시스템에서도 사용할 수 있도록 변환하는 기술.
    • “자바 시스템적으로 이야기하자면”
      • JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
  • 역질렬화(Deserialize)
    • 변환된 Data를 기존 데이터 형태로 변환하는 기술.
    • “자바 시스템적으로 이야기하자면”
      • 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태.

자바의 직렬화 조건

  • 자바 기본(primitive) 타입
  • java.io.Serializable 인터페이스를 상속받은 객체

Java Serializable이란?

  • Java에서는 자동으로 직렬화를 위한 인터페이스를 제공
  • 사용법은 단순히 사용할 곳에 java.io.Serializable을 implements하면 된다.
  • implements하면 JVM내부에서 자동으로 직렬화, 역직렬화를 처리한다.
  • 장점
    • 사용하기 편리하다는 것이다. 직렬화나 역직렬화에 대한 추가 코드가 필요없이 Serializable만 implements하면 된다.
  • 단점
    • Serializable 은 내부에서 Reflection 을 사용하여 직렬화를 처리하기에 cost가 많이든다.

예제

  • 코드
    • All of the fields in the class must be serializable. If a field is not serializable, it must be marked transient. ``` java public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number;

    public void mailCheck() { System.out.println(“Mailing a check to “ + name + “ “ + address); } }



``` java

public class SerializeDemo {

   public static void main(String [] args) {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      
      try {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      } catch (IOException i) {
         i.printStackTrace();
      }
   }
}
import java.io.*;
public class DeserializeDemo {

   public static void main(String [] args) {
      Employee e = null;
      try {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      } catch (IOException i) {
         i.printStackTrace();
         return;
      } catch (ClassNotFoundException c) {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
   }
}
  • 결과 : ``` Deserialized Employee… Name: Reyan Ali Address:Phokka Kuan, Ambehta Peer SSN: 0 Number:101

```

직렬화 법

  • 문자열 형태의 직렬화 방법
    • csv, json
  • 이진 직렬화 방법
    • 데이터 변환 및 전송 속도에 최적화하여 별도의 직렬화 방법
    • Protobuf,avro
  • 자바 직렬화
    • 자바 프레임워크 끼리 주고 받을 수 있는 데이터로 직렬화

참고자료 : https://www.tutorialspoint.com/java/java_serialization.htm



computer-science Share Tweet +1