-
[Class]/[Java i/o] 객체의 직렬화Java-diary/REFERENCE TYPE 2020. 2. 7. 17:59
정의
- 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용 할 수 있도록 byte형태로
데이터를 변환하는 기술
-JVM의 메모리에 상주(힙 또는 스택) 되어 있는 객체 데이터를 바이트 형태로 변환하는 기술- - 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)
-직렬화된 바이트 형태의 데이터를 객체로 변환 해서 JVM으로 상주시키는 기술-
*나오게 된 배경
자바 I/O 처리는 정수,문자열,바이트 단위의 처리만 지원했었다. 복잡한 객체의 내용을 저장/복원하거나,네트워크로 전송하기 위해서는 객체의 멤버변수의 각 내용을 일정한 형식(패킷)으로 만들어 전송해야 했다.객체 직렬화는 객체의 내용을 자바 I/O가 자동적으로 바이트 단위로 변환하여,저장/복원하거나 네트워크로 전송할 수 있도록 기능을 제공해준다.
객체 전송 단계
- 직렬화된 객체를 바이트 단위로 분해-marshalling-
- 분해된 데이터를 순서에 따라 전송
- 전송 받은 데이터를 원모습으로 복구 -unmarshalling-
*Marshalling
- 데이터를 바이트 덩어리로 만들어 스트림에 보낼 수 있는 형태로 바꾸는 변환 작업
- 마셜링을 적용할 수 있는 데이터 : Primitive Type,Reference Type중 Serializable인터페이스 구현 객체
*Unmarshalling
- Marshalling을 통해 바이트로 분해된 덩어리를 원래의 객체로 복구하는 작업
- 복구를 위해 어떤 객체 형태로 복구할지 형 변환을 명확하게 해주어야 한다.
*ObjectOutputStream 클래스
- 객체는 Primitive Type과 달리 일정한 크기를 가지지 않고 객체 내부의 멤버 변수가 다르기 때문에 크기가 천차만별로 달라진다. 이러한 문제를 처리할 수 있는게 ObjectOutputStream 클래스
*ObjectInputStream 클래스
ObjectStream 특징
- ObjectStream은 직접적으로 파일에 접근할 수 있는 능력이 없다.
- 간접적 접근을 위해 FileStream을 이용한다.
- FileStream과 OutputStream은 ByteStream의 자식 Class일뿐 직접적인 관계는없다.
- ObjectStream의 생성자 매개변수에 ByteStream을 매개변수로 가지는 생성자가 존재
- ByteStream변수에 자식 Class인 FileStream의 참조값을 넣어 이용
직렬화 조건
- Primitive Type
- Serializable 인터페이스 구현 객체
- 해당 객체의 멤버 모두 Seralizable 인터페이스 구현된 객체
- Transient 사용 되지 않은 멤버를 가진 객체
*Transient
객체를 직렬화하여 저장할 때 이 변수는 저장하지 않도록 하는 역할
SerialVersionUID
- 버전관리
- 직렬화를 하게 되면 자동으로 UID 고유 번호를 생성
- UID는 직렬화 역직렬화 시 주요한 역할
-값이 맞는지 확인후 처리하기 때문 다르면 오류가 난다.- - SerialVersionUID를 직접 선언후 관리하는 방식을 권장.
'Java-diary > REFERENCE TYPE' 카테고리의 다른 글
[완성도-1단계][객체지향 4대 특성]캡슐화 (0) 2020.03.15 [객체지향 4대 특성] 추상화,다형성 (0) 2020.03.15 [Class][Java i/o]PrintWriter (0) 2020.02.07 [Class]/[Java.util]/[Collection] Generic (0) 2020.02.06 [Class]/[Java.util]/[Collection] Set (0) 2020.02.06 - 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용 할 수 있도록 byte형태로