직렬화 (Serialization) 와 역직렬화(Deserialization)
직렬화란?
- 객체를 직렬화 하여 전송 가능한 형태로 만드는 것을 의미
- 데이터를 연속적인 데이터로 변형하여 Stream을 통해 데이터를 읽도록 해줌(byte형태로 변환)
- 주로 객체들을 통째로 파일로 저장하거나 전송하고 싶을 때 주로 사용
역직렬화란?
- 직렬화된 파일 등을 역으로 직렬화하여 다시 객체의 형태로 만드는 것을 의미
- 저장된 파일을 읽거나 전송된 스트림 데이터를 읽어 원래 객체의 형태로 복원
왜 사용하나요
데이터 포맷이 맞지 않아 json 형식으로 만들어서 사용하는등 이미 많이 사용하고 있었습니다.
- Json형태로 변환도 직렬화
- Jackson, GSON 등의 라이브러리를 이용해서 변환
자바 직렬화의 장점
- 자바 시스템 개발에 최적화
- 라이브러리 이런거 없이 바로 직렬화 가능
→ 역직렬화가 되면 기존 객체처럼 바로 사용 가능
직렬화를 해보자
public class Member implements Serializable {
}
하지만
java.io.Serializable 인터페이스를 상속받은 객체는 직렬화 가능
다른 객체를 멤버변수로 가지고 있는 경우
import java.io.Serializable;
public class Member implements Serializable {
private Long id;
private String password;
private String email;
private Address address;
private BaseTimeEntity baseTimeEntity;
}
Member 객체 안에 BaseTimeEntity, Address라는 객체가 있다고 가정
이 클래스중에 Serializable 인터페이스를 구현한 클래스가 하나라도 없으면 직렬화 X
직렬화 코드
public static void main(String[] args) {
conductSerializing();
conductDeserializing();
}
public static void conductSerializing() {
try {
FileOutputStream fos = new FileOutputStream("user");
BufferedOutputStream bos = new BufferedOutputStream(fos);
ObjectOutputStream out = new ObjectOutputStream(bos);
Member member1 = new Member(1L, "1234", "tnswh@abc.com");
Member member2 = new Member(2L, "8877", "tnswh@abc.com");
ArrayList list = new ArrayList<>();
list.add(member1);
list.add(member2);
out.writeObject(member1);
out.writeObject(member2);
out.writeObject(list);
System.out.println("out = " + out);
out.close();
System.out.println("serialize");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void conductDeserializing() {
try {
FileInputStream fis = new FileInputStream("user");
BufferedInputStream bis = new BufferedInputStream(fis);
ObjectInputStream in = new ObjectInputStream(bis);
Member member1 = (Member) in.readObject();
Member member2 = (Member) in.readObject();
ArrayList list = (ArrayList) in.readObject();
System.out.println(member1.toString());
System.out.println(member2.toString());
System.out.println("count :: " + list.size());
System.out.println(list.toString());
in.close();
} catch (Exception e) {
}
}
- 역직렬화 할 때 순서가 매우 중요 → 순서가 맞지 않으면 실패
- 그래서 ArrayList같은 자료구조로 한번에 넣는것이 효율적
SerialVersionUID
- 직렬화하면 내부에서 자동으로 SerialVersionUID라는 고유의 번호를 생성하여 관리
객체의 변경은 계속 일어나므로 SerialVersionUID를 직접 선언하고 관리하는 방식을 적극 권장하고 있다.
public class Member implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String password;
private String email;
}
'언어 > 자바' 카테고리의 다른 글
열거형(enum) (0) | 2021.09.16 |
---|---|
자바 - 제네릭(Generic) (0) | 2021.09.13 |
thread에 대해서! (0) | 2021.09.11 |
자바 컬렉션(List, Map, Set) (0) | 2021.09.10 |
동시성(Concurrency)과 병렬성(Parallelism) (0) | 2021.09.08 |