∞. 기술 면접/7. 자바

08. 기술면접 - 자바 - 직렬화(Serializable)

THE HEYDAZE 2021. 10. 21. 10:42
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다

자바 직렬화란?

- 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로
  데이터를 변환하는 기술이다 (주로 네트워크 통신할 때)

- 시스템적으로 이야기하면 JVM의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술

 

자바 직렬화 조건

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

 

직렬화 방법

- java.io.ObjectOutputStream 객체를 이용

 

public  class Serial implements Serializable {

    int a = 10;
    int b = 200;
    String c = "hello world";

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        
        Serial s = new Serial();
        ObjectOutputStream oos = new ObjectOutputStream(System.out);
        oos.writeObject(s);

    }
}

System.out 을 통한 직렬화

 

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public  class Serial implements Serializable {

    int a = 10;
    int b = 200;
    String c = "hello world";

    public static void main(String[] args) throws IOException {

        FileOutputStream file_out = new FileOutputStream("test");

        Serial s = new Serial();
        ObjectOutputStream oos = new ObjectOutputStream(file_out);
        oos.writeObject(s);

        file_out.close();
        oos.close();
    }
}

FileOutputStream 을 통한 직렬화 (프로젝트 최상단에 생성된다)

 

import java.io.*;

public  class Serial implements Serializable {

    int a = 10;
    int b = 200;
    String c = "hello world";

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        FileInputStream file_in = new FileInputStream("test");

        ObjectInputStream ois = new ObjectInputStream(file_in);

        Serial o = (Serial) ois.readObject();

        System.out.println(o.a);
        System.out.println(o.b);
        System.out.println(o.c);
    }
}

파일을 정상적으로 출력 (역직렬화)

 

자바 역직렬화 (Deserialization) 란

- 바이트로 변환된 데이터를 다시 객체로 변환하는 기술
- 직렬화 된 바이트 형태의 데이터를 객체로 변환해서 JVM 으로 상주시키는 형태 기술

 

자바 역직렬화 조건

- 직렬화 대상이 된 객체의 클래스가 클래스 path 에 존재해아하며 import 되어 있어야 한다
  ㄴ중요한 점은 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 반드시 고려해야 한다
     (같은 시스템 내부이라도 소스 버전이 다를 수 있다.)

- 자바 직렬화 대상 객체는 동일한  serialVersionUID 를 가지고 있어야 함
  private static final long serailVersionUID = 1L;

 

참고

https://velog.io/@sa1341/Java-%EC%A7%81%EB%A0%AC%ED%99%94%EB%A5%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C