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 |