직렬화, 역직렬화란?
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.io.Serializable
인터페이스를 impliments한 객체만이 직렬화가 가능하다.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를 관리하는 이유
try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedHubContent)) {
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
// 역직렬화된 HubContent 객체를 읽어온다.
Object objectHubContent = ois.readObject();
HubContent hubContent = (HubContent) objectHubContent;
}
- Java 직렬화 대상 객체는 동일한
serialVersionUID
를 가지고 있어야 한다. - 그림과 같이 동일한 객체인지 식별하기 위해 꼭 필요하다.
최초작성 : 22/04/16
Author And Source
이 문제에 관하여(직렬화, 역직렬화란?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kimjaejung96/직렬화-역직렬화란저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)