반응형
0. History
- 이 글은 2012-01-25 초안 작성 시작하였습니다.
- 잘못된 정보, 오래된 정보, 오타가 있으면 Comment 남겨주세요. 확인 후 수정하겠습니다.
- 이 글은 2012-01-25 초안 작성 완료하였습니다.
1. Information
Serializable이 뭐죠?
Developer 를 참조하여 설명 드리겠습니다.
Serializable 은 empty 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
반응형
댓글