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