-
직렬화 vs 역직렬화Java/Basics 2019. 6. 14. 14:23
■직렬화란?
- 객체를 파일로 저장하거나 네트워크를 통하여 다른 곳으로 전송하려면, 객체를 바이트
형태로 일일이 분해해야함. 이 작업을 '직렬화' 라고 한다.
- 다시말해, 데이터를 연속적인 데이터로 변형하여 객체를 전송 가능한 형태로 만드는
것이다.
- 사용 예 : RMI, BEAN 생성 등
■Serializable Interface
- Serializable 인터페이스를 구현하면, JVM은 해당 클래스가 직렬화의 대상이라는
것을 인지하게 됨.
- 타 인터페이스와 달리 구현해야 할 메소드가 없음. 단지 선언만 해두면 끝!!
- 생성자, 메소드, 클래스변수를 제외한 '멤버변수'만이 직렬화 대상
- 멤버변수에 transient 제어자를 붙이면 직렬화의 대상에서 제외
- 멤버변수에 Serializable을 구현하지 않은 클래스가 있는 클래스는 직렬화 불가능.
- 동일한 타입의 다수 객체를 직렬화하게 되는 경우, list를 사용하여 직렬화하는 것이 좋음
(직렬화나 역직렬화 할 때, 순서가 적용되기 때문)
■SerialVersionUID
- 직렬화를 하게 되면, 클래스(?) 내부에서 자동으로 SerialVersionUID라는 고유의 번호가
생성됨.
- 역직렬화를 할 때, 이 값이 맞지 않는다면 InvalidClassException이 발생함.
- 컴파일하고 배포될 때마다 이 ID는 계속 변경될텐데, 매번 Exception 처리를 하기가
번거로움. 때문에 Java에서는 클래스 내에 SerialVersionUID를 직접 선언하는 방식을
적극 권장(private static final long serialVersionUID = 1L;)
■역직렬화란?
- 직렬화된 객체를 역으로 직렬화하여 다시 객체 본래의 형태로 만드는 것
https://devbox.tistory.com/entry/Java-%EC%A7%81%EB%A0%AC%ED%99%94
https://wickedmagic.tistory.com/279
https://flowarc.tistory.com/entry/Java-%EA%B0%9D%EC%B2%B4-%EC%A7%81%EB%A0%AC%ED%99%94Serialization-%EC%99%80-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94Deserialization
'Java > Basics' 카테고리의 다른 글
vm args vs prog args (0) 2020.01.10 인터페이스 vs 추상클래스 (0) 2019.06.20 Java의 날짜와 시간 API (0) 2019.06.06 자바 빌드 툴 (0) 2019.05.21 자바 메모리 구조(Runtime Data Area) (2) 2019.05.16 댓글