직렬화 (serialization)
Data - Input Output - Stream 은 데이터 형에 따른 메서드를 호출해서 저장하고 복원하는 일
직렬화는 오브젝트 자체 인스턴스 자체를 저장하고 이를 다시 복원하는 방식
파일에 하는 경우도 있고, 네트웍으로 전송할 때,
serialization 이란?
- 인스턴스의 상태를 그대로 파일 저장하거나 네트웍으로 전송하고 (serialization) 이를 다시 복원(deserializatio) 하는 방식
- 자바에서는 보조 스트림을 활용하여 직렬화를 제공함
- ObjectInputStream과 ObjectOutputStream
생성자 | 설명 |
ObjectInputStream(InputStream in) | InputStream을 생성자의 매개변수로 받아 ObjectInputStream을 생성합니다. |
ObjectOutputStream(OutputStream out) | OutputStream을 생성자의 매개변수로 받아 ObjectOutputStream을 생성합니다. |
Serialization
- 클래스 생성
- 직렬화 테스트
- ObjectInputStream / ObjectOutputStream / 생성자 만들어 주기
- ObjectOutputStream(fos) - FileOutputStream fos를 생성자의 매개변수로 받아 ObjectOutputStream을 생성
- ObjectInputStream(fos) - FileInputStream fos를 생성자의 매개변수로 받아 ObjectInputStream을 생성합니다.
- 직렬화 하려고 보니 표시된 클래스가 없다
Serializable 인터페이스
- 직렬화는 인스턴스의 내용이 외부로 유출되는 것이므로 프로그래머가 해당 객체에 대한 직렬화 의도를 표시해야 함
- 구현 코드가 없는 marker interface
- transient : 직렬화 하지 않으려는 멤버 변수에 사용함 (Socket 등 직렬화 할 수 없는 객체)
- 직렬화 하겠다는 의도 표시
- implements Serializable
- transient - 직렬화 안 하려는 거나 못하는 거에 써줌 / 안되면 null 값 준다.
직렬화 잘 되어서 정상 출력됨을 확인!
transient 걸어준 job 부분은 null 값 확인
+@ serial.txt 파일에 가보면 이렇게 저장되어있음. 이것을 저장 / 전송 / 복원해주는 것이 직렬화
ObjectOutput objectInput 할 때는 writeObject readObject 하면 되는데
Externalizable 인터페이스
- writerExternal( )과 readExternal( ) 메서드를 구현해야 함
- 프로그래머가 직접 객체를 읽고 쓰는 코드를 구현할 수 있음
- implements Externalizable
- 프로그래머가 직접 구현 External - implements Serializable이 X 아닌
- 구현할 메서드가 있음 - Serializable에서는 없었음 marker interface

직렬화라는 것은 인스턴스 값을 그대로 저장하거나 / 전송하고
저장된 값을 다시 복원하거나 / 전송받은 상태에서 복원할 수 있는데
그때 사용하는 인터페이스가 Serializable / Externalizable 인터페이스가 있다.
자바 클래스들은 Serializable로 구현되어있음 그중에서 사용할 수 없는 애들은 Externalizable로 직접 구현
그 외 여러 가지 입출력 클래스들
File 클래스
- 파일 개념을 추상화한 클래스
- 입출력 기능은 없고, 파일의 이름, 경로, 읽기 전용 등의 속성을 알 수 있음
- 파일인지 이름이 뭔지 경로는 어딘지 등
- 이를 지원하는 여러 메서드들이 제공됨
- createNewFile() 메서드 호출해야 파일 생성됨
- 각 함수는 클래스의 help 참조
RandomAccessFile 클래스
- 입출력 클래스 중 유일하게 파일에 대한 입력과 출력을 동시에 할 수 있는 클래스 ( 스트림은 아님 )
- 파일 포인터가 있어서 읽고 쓰는 위치의 이동이 가능함
- 다양한 메서드가 제공됨
잠깐 파일에서 무슨 자료를 얻거나 간단한 데이터를 읽어드릴 때는 편함.
랜덤으로 읽어야 한다. 어느 위치로 이동해야 한다.
파일 포인터가 움직이고 위치를 알 수 있다 getFilePionter
파일포인터 위치 이동 가능 seek()
읽을 때는 쓴 메서드 그대로 읽어야 한다. 순서/형태
int 4 byte
double 8byte
한글이 3byte씩 잡힘
( String 3 X 5 )+ (안 보이지만 마지막에 nullchar 2byte ) = 17
4/ 12 / 29 포인터 위치 확인
오류난 이유 : 프린터가 계속 돌아가는데 쓴 부분부터 읽어오라고 해서 오류남
- 포지션 지정 필요 seek( )
유일하게 read와 write 모두 할 수 있는 클래스
파일을 쭉 쓰고 쭉 읽고 할 때 사용하기보다는
주로 쓰는 용도 : 중간중간에 파일 포인터가 이동을 해서 읽기도 쓰기도 할 때 사용한다.
review
직렬화 - Serialization
인스턴스 상태 그대로를 파일 저장하거나
네트웍으로 전송하고 (serialization) 이를 다시 복원(deserializatio) 하는 방식
ObjectInputStream / ObjectOutputStream
writeObject / readObject
implements - Serializable / Externalizable 인터페이스
개념 체크
그 외 클래스로 File 클래스와 RandomAccessFile 클래스가 있다.
여러 가지 값으로 변화하는 인스턴스 상태 중에서 직렬화 할 때의 그 상태를
그대로 저장하거나 전송하고 복원하는 방식의 직렬화
현재 회원 등급을 가지고 한 달 두 달 뒤에 상품을 지급하는 상황에서
복사해놓고 나중에 복원해서 사용하는 것인가?
실제 어떤 상황에서 사용하는지는 아직 모르겠다.ㅎㅎ
직렬화 할 클래스라는 거 표시해주고, 하지 않을 변수나 못하는 변수에 transient 표시해주고,
직렬화 방식 있는 거 사용할지 직접 구현할지 해주면 된다!
파일의 상태 체크 File / 클래스 중간중간 랜덤 위치로 이동해서 읽기 쓰기 둘 다 가능 FileRandomAccess
체크해 놓자!
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter6' 카테고리의 다른 글
자바에서 Thread 만들기 (0) | 2022.01.28 |
---|---|
데코레이터 패턴예제 실습 ) 커피 머신 프로그램 (0) | 2022.01.27 |
여러가지 보조 스트림 클래스들( InputStreamReader, BufferedInputStream, DataInputStream ) (0) | 2022.01.24 |
문자 단위 입출력 스트림 ( Reader , Writer ) (0) | 2022.01.24 |
바이트 단위 입출력 스트림 ( InputStream / OutputStream ) (0) | 2022.01.23 |