직렬화, 역직렬화란?

6071 단어 직렬화직렬화

Java 내부 시스템에서 사용되는(JVM 메모리에 올려져있는) 객체나 데이터를 외부에서 사용할 수 있도록 Byte 형태로 변환하는것.

직렬화


  • Java.io.Serializable 인터페이스를 impliments한 객체만이 직렬화가 가능하다.
  • 객체 안의 객체 멤버 중, Serialrizable 인터페이스를 impliments를 하지 않았으면 불가능하다.
  • 객체 내 @Trasient가 선언된 멤버는 전송되지 않는다. (직렬화에서 제외)

직렬화 e.g


  • Java.io.Serializable 인터페이스를 상속받는다.
  • serialVersionUID를 설정한다.
@Entity
@AllArgsConstructor
@toString
public class HubContent implements Serializable {
private static final long serialVersionUID = 1L;
    
private String title;
private String subtitle;
...
  • Java 직렬화는 java.io.ObjectOutPutStream 객체를 이용한다.
  • 객체를 직렬화하여 Byte 배열 형태로 변환한다.
HubContent hubcontent = new HubContent("제목", "부제");
byte[] serializedHubContent;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
    oos.writeObject(hubContent);
        
    // 직렬화된 HubContent 객체
    serializedHubContent = baos.toByteArray();
}

역직렬화 e.g


  • 역직렬화를 하기 위해서는 직렬화 대상이 된 객체의 클래스가 ClassPath에 존재해야 하며 import 되어있어야 한다.
try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedHubContent)) {
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
        
    // 역직렬화된 HubContent 객체를 읽어온다.
    Object objectHubContent = ois.readObject();
    HubContent hubContent = (HubContent) objectHubContent;
}

SerialVersionUID를 관리하는 이유


  • Java 직렬화 대상 객체는 동일한 serialVersionUID를 가지고 있어야 한다.
  • 그림과 같이 동일한 객체인지 식별하기 위해 꼭 필요하다.

최초작성 : 22/04/16

좋은 웹페이지 즐겨찾기