[Spring FrameWork] Java의 직렬화(Serialize)란?

이도훈·2021년 8월 25일
1
  1. 직렬화란?
  • 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술로써, JVM의 메모리 (in Stack or heap) 에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술이다.
  • 다차원의 자료를 파일로 저장하거나 네트워크로 보내기에 알맞게 일차원으로 펼치고 다시 원래대로 되돌리는 것을 직렬화(Serialization)이라고 한다.
  • 역직렬화는 직렬화의 반대를 의미 (바이트 => Object or Data)
  1. 직렬화 예제
  • 직렬화 조건

    java.io.Serializable 인터페이스 상속받는 객체

  • 직렬화 예제

import java.io.Serializable;

// Serializable 인터페이스 상속
public class Member implements Serializable {
    private String name;
    private String email;
    private int age;

    public Member(String name, String email, int age) {
        this.name = name;
        this.email = email;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Member{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
    

    // 직렬화 실행
    public static void main(String[] args) throws IOException {
        Member member = new Member("Lee Dohun", "dohun@abc.com", 28);
        byte[] serializedMember;
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
                oos.writeObject(member); // oos 에 직렬화의 대상인 member 객체를 전달
                serializedMember = baos.toByteArray();
                // toByteArray() 메서드를 통해 직렬화 수행 ( Object -> Byte )
            }
        }
        System.out.println(Base64.getEncoder().encodeToString(serializedMember));
        // 직렬화된 Member 값을 base64 method로 인코딩
        // 인코딩된 Member 값 : rO0ABXNyABpjb20uZXhhbXB...8
    }  
}
  • 역직렬화 예제
public static void main(String[] args){
    // 직렬화 예제에서 생성된 base64 데이터
    String base64Member = "rO0ABXNyABpjb20uZXhhbXB...8";
    byte[] serializedMember = Base64.getDecoder().decode(base64Member);
    try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedMember)) {
        try (ObjectInputStream ois = new ObjectInputStream(bais)) {
            // 역직렬화된 Member 객체를 읽어온다.
            Object objectMember = ois.readObject();
            Member member = (Member) objectMember;
            System.out.println(member);
        }
  • 추후에 내용 추가

감사합니다~

profile
back-end developer

0개의 댓글