Serial : 연쇄. 연속해서 이어지는 어떤 것.

 

 

Serialization(직렬화) :

Object를 "연속된 문장형데이터"나 "연속된 바이트"단위로 바꾸는 거에요.

왜 이런 짓을 하냐면,

 

Object는 메모리에 존재하고, 추상적인데,,,

string과 byte는 "드라이브에 저장"도 할 수 있고, "통신선에서 전송"도 할 수가 있다.

 

 


 

 

 


 

참고

https://www.youtube.com/watch?v=variM5qJsQM

 

 

 

1. 직렬화(Serialization) 설명

- Object를 -> Binary 형태의 파일로 바꾸는 것입니다.

 

- Binary 파일은 2진법이며, 0,1로 이루어져 있습니다. (ex 1010 0000 1111)

 

- 확장자는 .bin(Binary의 약자) 이나 .ser(Serialization의 약자) 이 붙습니다.  (Binary파일 입니다.)

 

 

 

 

2. 역직렬화(Deserialization) 설명

- Deserialization : 역직열화

 

- Binary 형태의 파일을 -> Object로 바꾸는 것입니다.

 

 

 

 

3. 직렬화를 써먹는 이유

- "직렬화 배우는 이유" -> 저장을 위해서 배우는 거임.

 

 

 

 

4. 정리를 하자면, ★

이런게 직렬화 입니다.

 

직렬화를 통해서,

Object의 데이터들 하드디스크(Binary 형태의 파일)에 저장을 하고,

 

그런 다음에,

 

역직렬화를 해서,

하드디스크(Binary 형태의 파일)에 있던 데이터들을, 다시 불러 오는 것입니다.

 

 

 

 

 

 

4-1. 

직렬화 -> 저장하는거

 

역직렬화 -> 불러오는거

 

 

 

 

 

 

5. 직렬화 과정

1) 자, 그러면 Object를 만든다

 

 

2) 그냥 연습,, 잘 작동하는지 알아볼 려구,,,, (이건 필요 없음)

 

 

 

3) 이제, 직렬화를 통해서, "rin오브젝트"를 저장을 해보겠습니다.

★직렬화 할 때는 2가지 클래스가 필요합니다. (FileOutputStream, ObjectOutputStream)

3-1) 설명

FileOutputStream <- 이거 사용해서 먼저 파일을 선택을 해야한다. (선택을 하는 클래스)

ObjectOutputStream <- 이거 사용해서, 매개변수에다가 해당 FileOutputStream을 주어서 저장을 하게됩니다.

 

3-2) 추가 설명

FileOutputStream <- 파일이 현재 존재하면 덮어씌우고, 없으면 새로 만들어 진다.

ObjectOutputStream <- 이거 사용해서, 매개변수에다가 해당 FileOutputStream을 주어서 저장을 하게됩니다.

 

3-3) 그리고 진짜 정말로 저장을 하는 방법은

~~.writeObject() <- 이걸로 저장하는건데, 저장할 Object를 매개변수로 줍니다.

 

3-4) 

~~.close() <- ObjectOutputStream를 사용을 다했으면, 닫아주어야 합니다.

              <- close()를 안해주면 메모리가 새나간다!! (그러면 메모리가 비효율적이다.), 꼭 해줘라!!

 

 

3-5)

설명 -> 실행하면 에러가 발생 할 것이다.

왜냐하면!, Student클래스는 직렬화할 수 없는 클래스 이기때문이다.

 

 

(참고)

이렇게 적어도 됨

 

 

 

 

3-6) Student클래스를 직렬화할 수 있는 클래스로 바꿔 줍니다.

 - Student클래스에 Serializable이라는 것을 장착시켜 주어야 합니다.

 - 장착시켜주면 Student클래스는 직렬화 할 수 있게 변합니다.

 

 

 

3-7) 다시 실행해보면 에러가 안나고 잘 작동합니다.

 

 

 

 

3-8) 그리고 실행 하고나서, 폴더를 보면(새로고침 해주삼) "rin.bin"파일이 생겼습니다.

 

 

 

 

3-9) 다시 프로그램 한번 더 실행을 시켜도 "rin.bin"파일이 새로 생기지 않고 덮어씁니다.

 

 

 

 

 

 

 

6. 역직렬화 과정

1) 직렬화랑 거의 비슷한데, 

Input으로만 바꿔주면 됨.

 

 

2) 읽는 거 (가져오는거)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

위에 까지 설명만 봐도 됨.

 

 

 

 

 

 


 

-밑에 내용은 그냥 알고 있으면, 괜춘할 듯-

 

 

0. serialVersionUID

 

월래 직렬화를 사용할 때는 보통 serialVersionUID라는 것을 사용하게 됩니다.

이거 넣어주어야함 ,,, 보통은 그렇다고함.

 

 

 

 

밑에 처럼 넣어주어야함

 

 

 

 

왜냐하면,

serialVersionUID 가 있어야하는 이유는,

업데이트를 했었을 때, 계속해서 버전을 바꿔주기위해서, ID를 만든 것입니다.

 

 

예를 들어서,

알파버전을 만들었고, 알파버전에서는 이미 지정한 serialVersionUID  적용했으나,

나중에 더 개발을 해서 업데이트를 해서 배타버전을 만들었다고 가정을 한다면,

배타버전에서 예전에 알파버전꺼를 사용하면 안되니깐,  serialVersionUID 를 바꿔 주었습니다.

 

마치, 옛날버전을 가지고 새로운 버전의 파일을 쓸 수 없는 것처럼,  serialVersionUID 를 바꿔 주었던 것입니다.

 

프로그램에 알맞는 버전의 데이터만 불러오게 할려고,  serialVersionUID 를 사용하는 겁니다.

 

 

 

 

 


 

 

 

-밑에 내용은 그냥 알고 있으면, 괜춘할 듯-

 

 

0. transient

 

설명 ->

serializable클래스에서 변수에다가 transient 주면

직렬화 할 때, 제외 됩니다.

(밑에 결과 처럼 해당 값이 저장이 안됩니다.)

'■ JAVA > Study' 카테고리의 다른 글

[JAVA] 스트림(stream)  (0) 2020.09.21
[JAVA] 진수변환(10진수->2진수,8진수,16진수)  (0) 2020.09.21
[JAVA] clone  (0) 2020.09.16
[JAVA] finalize  (0) 2020.09.16
[JAVA] 제네릭  (0) 2020.06.17