학습목표
- 자바 직렬화
- Serializable
- 자바 직렬화 흐름
직렬화
- 객체의 상태를 영속화 하는 메커니즘
- 객체를 다른 환경에 저장했다가 나중에 재구성할 수 있게 만드는 과정
자바 직렬화
- 쉬운 분산 객체 생성
- Byte Stream을 만드는 것
- 언제 쓰지? 객체 상태를 영속해야 할 필요가 있을 때
- 어딘가에 저장해야 할 때가 있을때
- 파일, 데이터베이스, 캐시 메모리
- 다른 vm으로 객체 정보를 전달해야할 때 바이트 스트림으로 전송해야 할 때
- 어딘가에 저장해야 할 때가 있을때
- 개체 그래프의 보완적인 재구성도 합니다.
- 경량의 지속성과 소켓, Java RMI 을 지원합니다.
- 기본적으로 인코딩을 통해 데이터를 보호하고, 자체 인코딩 구현을 할 수도 있습니다.
자바 직렬화 API
- 직결화된 데이터를 클래스의 필드와 독립적으로 지정할 수 있는 API를 제공하며 기본 쓰기, 읽기 메커니즘을 제공한다.
Serializable
- 해당 인터페이스를 implements를 해야 한다. 하지 않으면 NotSerializableException이 발생한다.
문제점 (왜 잘 안쓰지?)과 해결책
- 보안
- 보이지 않는 생성자, readObject : readObject 생성자로 생성되기 때문에 누군가에 의해 값이 변경될 수 있다.
- 해결 : 커스텀직렬화에 validation을 처리하여 방어적으로 처리.
- 보이지 않는 생성자, readObject : readObject 생성자로 생성되기 때문에 누군가에 의해 값이 변경될 수 있다.
public class PositiveNumber implements Serializable{
public final int value;
public PositiveNumber(final int value){
this.value = value;
checkPositive();
}
private void checkPositive(){
if(this.value < 0){
throw new RuntimeException();
}
}
private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException{
objectInputStream.defaultReadObject();
checkPositive();
}
}
- 아래와 같이 직렬화 프록시 패턴, writeReplace 를 적용하면 관리포인트를 줄일 수 있다.
- 유지보수성
- 테스트
- 그 외 다수 (ex. 싱글톤 문제, 역직렬화 폭탄 등)
- 싱글톤 문제
- 직렬화 - 역직렬화를 거치면 싱글톤 객체의 성격이 없어진다.
- 아래와 같은 흐름으로 커스텀 직렬화/역직렬화 활용
- 결론 : json,xml 같은 크로스 커뮤니케이션이 가능한 포맷을 이용하는걸 권장
출처 : 오라클 자바 공식 문서
https://docs.oracle.com/javase/8/docs/technotes/guides/serialization/index.html
https://www.youtube.com/watch?v=3iypR-1Glm0
'Backend > Java' 카테고리의 다른 글
Kotlin "코틀린 완벽 가이드" 스터디 1주차 (1) | 2024.01.21 |
---|---|
[Java] Stack, Deque, LinkedList (0) | 2022.03.12 |
[Java] HashTable / HashMap / 연결리스트의 중간노드 찾기 / LRU 캐시 (0) | 2022.02.22 |
[Java] 재귀함수 / 일반재귀 vs 꼬리재귀 / 언어별 꼬리 재귀 최적화 / 연결리스트 꼬리재귀 코드 (0) | 2022.02.20 |
[Java] 싱글스레드 / 멀티스레드 / 스레드의 IO 블록킹 /스레드 우선순위 / 스레드 그룹 / 데몬 스레드 (0) | 2022.02.14 |