본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] Serializable이 뭔가요? Serializable class 를 만들 때 serial Version UID 가 필요한 이유를 아시나요?

by 돼지왕 왕돼지 2012. 1. 25.
반응형


0. History


- 이 글은 2012-01-25 초안 작성 시작하였습니다.
- 잘못된 정보, 오래된 정보, 오타가 있으면 Comment 남겨주세요. 확인 후 수정하겠습니다.
- 이 글은 2012-01-25 초안 작성 완료하였습니다.




1. Information


Serializable이 뭐죠?


Developer 를 참조하여 설명 드리겠습니다.

Serializableempty marker interface 입니다. 즉 안에 내용은 아무것도 없는 interface로 이 녀석은 serializable 하다는 것은 "표시만" 하는 녀석입니다.
이 녀석을 implements 했다는 것은  ObjectOutputStream과 ObjectInputStream에서 해당 object가 사용될 때 serialization 과 deserialization 이 자동 지원이 된다는 의미입니다.

그럼 Serialization과 Deserialization은 뭘까요?

Serialization은 한국말로 하면 "직렬화" 입니다.
해당 Object를 구성하는 모든 것들을 한줄로, 직렬로 만들어서 저장, 전송 등을 편하게 한다는 의미입니다.
Deserialization은 반대로 한줄로 된 내용을 원래의 Object 형태로 변형해준다는 이야기입니다.


잘 감이 안 오신다면 예를 한번 들어봅시다. 

<클래스 정의>
class Employee{
   long personalID;
   String address;


<Object 생성>
Employee employee1 = new Employee();
employee1.personalID = 123456L;
employee1.address = "Seoul"

<Serialization 된 Object>
serializedEmployee1 = "classID:employee1 | int:personalID:123456L | String:address:"Seoul" "


실제 Serialization의 구현과는 다르고, 개념을 알기 위한 예임을 미리 밝혀드립니다. 
마지막을 보시면 serialized 된 employee1 object 는 한줄로, 직렬화 되어 해당 object 를 묘사하고 있습니다.
Deserialization은 반대로 저 직렬화된 object 를 실제 object 의 형태로 변환해주는 것을 이야기하죠.

자, 이제 감이 오시나요?


[Serializable에 대한 깊숙한 이야기]



이제 Serialization 이 뭔지는 알겠어요, 근데 Serializable class 를 만들 때, 왜 serial version UID 가 필요하죠?


Serializable class 를 만들면서 serial veresion UID 를 만들지 않으면, eclipse에서 다음과 같은 warning 를 출력합니다.


이 녀석은 서로 다른 클래스들 간의 구별을 위해서 사용됩니다.

예를 들어 위의 Employee 와 같은 형태의 클래스가 2개가 있을 경우, deserialization 할 때 어떤 클래스인지 햇갈릴 수 있습니다.
이런 경우를 방지하기 위해서 UID 를 통해서 같은 형태의 클래스가 있을 때 이 녀석이 내가 원하는 Employee 구나.. 하고 알 수 있는 것입니다.
( 보안상으로도 조금 더 안정적이겠죠. )



그럼 serial version UID 는 어떻게 정의해요?


간단합니다.

static final long 의 형태로만 정의가 되면 됩니다.
이 때 value 는 개발자가 아무 수나 random 하게 지정해 주면 되겠습니다. 


private static final long serialVersionUID = 44L;




이거 안 해줘도 에러는 안 나죠?


명시적으로 선언해주지 않아도 default serialVersionUID 가 자동으로 입력되긴 합니다..
하지만 적은 확률로 deserialization 시 중복되는 경우가 생길 수 있고, 이 때는 잘못된 연산을 수행할 수 있죠..
게다가 안전성에서 조금 취약하다고 볼 수도 있죠. 

명시적으로 Serial Version UID 를 정의하여 사용할 경우에도 에러는 발생할 수 있는데요,
serialization 하는 쪽과 deserialization 하는 쪽의 UID 가 맞지 않으면 InvalidClassException 이 발생합니다.


[Default UID 계산에 이용되는 정보들]



손가락 추천 꾹~ 더 좋은 글로 보답하겠습니다~

2. Summary


- Serializable 은 empty marker interface 로 해당 class 가 serializable 하다고 표시만 하는 interface 입니다.

- Serialization 은 객체를 직렬화 하는 작업이며, Deserialization은 직렬화된 객체를 실제 객체로 바꾸는 작업입니다.

- Serial Version UID 는 Serialization 된 객체를 Deserialization 할 때 중복되는 녀석들에 대한 구분자로 사용하기 위해 정의되며, 명시적으로 정의하지 않아도 default value 가 입력됩니다.

- Serial Version UID 가 맞지 않을 경우는 InavalidClassCastException이 발생하며, 명시적으로 정의시 로직상, 보안상 더 안전합니다.




3. References


-  
http://developer.android.com/reference/java/io/Serializable.html
   Android Developer Doc. Serializable




4. Tags






반응형

댓글