본문 바로가기

카테고리 없음

Serialization 자바 직렬화

WHY?

우리가 java로 어플리케이션을 만들경우, 자바에 존재하는 객체를 외부에서도 사용해야할 경우가 생긴다.

그럴때 직렬화를 사용하게 된다.

 

WHAT?

자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술 & 바이트(byte)형태의 데이터를 자바 객체데이터로 변환해주는 기능

 

HOW?

 - 자바의 객체(class)를 정의할 때 자바 기본(primitive) 타입을 사용하고, 그 class에 java.io.Serializable 인터페이스를 implements해준다.

 - java.io.ObjectOutputStream 을 이용해서 직렬화를 시켜줄 것이다.

 

 Member member = new Member("홍길동", "hong@gamil.com",25);
    byte[] serializedMember;
    try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
            oos.writeObject(member);
            // serializedMember -> 직렬화된 member 객체 
            serializedMember = baos.toByteArray();
        }
    }
    // 바이트 배열로 생성된 직렬화 데이터를 base64로 변환
    System.out.println(Base64.getEncoder().encodeToString(serializedMember));
}

 

 

=============================================================

역직렬화 

위에서 생성된 base64데이터를 역직렬화하여 클래스로 만들어 줍니다.

 

    // 직렬화 예제에서 생성된 base64 데이터 
    String base64Member = "...생략";
    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);
        }
    }