JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter6

직렬화 (serialization)

giggs 2022. 1. 25. 11:58

 

직렬화 (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
체크해 놓자!