언어/자바

직렬화 (Serialization) 와 역직렬화(Deserialization)

ballde 2021. 9. 13. 06:18

직렬화 (Serialization) 와 역직렬화(Deserialization)

직렬화란?

  • 객체를 직렬화 하여 전송 가능한 형태로 만드는 것을 의미
  • 데이터를 연속적인 데이터로 변형하여 Stream을 통해 데이터를 읽도록 해줌(byte형태로 변환)
  • 주로 객체들을 통째로 파일로 저장하거나 전송하고 싶을 때 주로 사용

역직렬화란?

  • 직렬화된 파일 등을 역으로 직렬화하여 다시 객체의 형태로 만드는 것을 의미
  • 저장된 파일을 읽거나 전송된 스트림 데이터를 읽어 원래 객체의 형태로 복원

왜 사용하나요

데이터 포맷이 맞지 않아 json 형식으로 만들어서 사용하는등 이미 많이 사용하고 있었습니다. 

  • Json형태로 변환도 직렬화
  • Jackson, GSON 등의 라이브러리를 이용해서 변환

자바 직렬화의 장점

  • 자바 시스템 개발에 최적화
  • 라이브러리 이런거 없이 바로 직렬화 가능

→ 역직렬화가 되면 기존 객체처럼 바로 사용 가능

 

직렬화를 해보자

public class Member implements Serializable {
}

하지만

java.io.Serializable 인터페이스를 상속받은 객체는 직렬화 가능

다른 객체를 멤버변수로 가지고 있는 경우

import java.io.Serializable;

public class Member implements Serializable {

    private Long id;
    private String password;
    private String email;

    private Address address;
		private BaseTimeEntity baseTimeEntity;

}

Member 객체 안에 BaseTimeEntity, Address라는 객체가 있다고 가정

이 클래스중에 Serializable 인터페이스를 구현한 클래스가 하나라도 없으면 직렬화 X

 

직렬화 코드

public static void main(String[] args) {

conductSerializing();
conductDeserializing();
}

public static void conductSerializing() {
    try {
        FileOutputStream fos = new FileOutputStream("user");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        ObjectOutputStream out = new ObjectOutputStream(bos);
        Member member1 = new Member(1L, "1234", "tnswh@abc.com");
        Member member2 = new Member(2L, "8877", "tnswh@abc.com");
        ArrayList list = new ArrayList<>();
        list.add(member1);
        list.add(member2);
        out.writeObject(member1);
        out.writeObject(member2);
        out.writeObject(list);
        System.out.println("out = " + out);
        out.close();
        System.out.println("serialize");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static void conductDeserializing() {
    try {
        FileInputStream fis = new FileInputStream("user");
        BufferedInputStream bis = new BufferedInputStream(fis);
        ObjectInputStream in = new ObjectInputStream(bis);
        Member member1 = (Member) in.readObject();
        Member member2 = (Member) in.readObject();
        ArrayList list = (ArrayList) in.readObject();
        System.out.println(member1.toString());
        System.out.println(member2.toString());
        System.out.println("count :: " + list.size());
        System.out.println(list.toString());
        in.close();
    } catch (Exception e) {

    }
}
  • 역직렬화 할 때 순서가 매우 중요 → 순서가 맞지 않으면 실패
  • 그래서 ArrayList같은 자료구조로 한번에 넣는것이 효율적

SerialVersionUID

  • 직렬화하면 내부에서 자동으로 SerialVersionUID라는 고유의 번호를 생성하여 관리

객체의 변경은 계속 일어나므로 SerialVersionUID를 직접 선언하고 관리하는 방식을 적극 권장하고 있다.

public class Member implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;
    private String password;
    private String email;
}

 

'언어 > 자바' 카테고리의 다른 글

열거형(enum)  (0) 2021.09.16
자바 - 제네릭(Generic)  (0) 2021.09.13
thread에 대해서!  (0) 2021.09.11
자바 컬렉션(List, Map, Set)  (0) 2021.09.10
동시성(Concurrency)과 병렬성(Parallelism)  (0) 2021.09.08