카테고리 없음

Serialization 자바 직렬화

개발자자자 2020. 4. 12. 17:54

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);
        }
    }