이 글의 문맥을 분석하여 이글루스에 있는 많은 글 중에서 관련성이 높은 글을 자동으로 검색해 낸 결과입니다.
제갈장비
dojeun.egloos.com
이글루스 | 로그인

라면 한그릇 드세요.. ㅋㅋ
by 제갈장비
카테고리
전체
제갈장비-Linux
제갈장비-TOMCAT
제갈장비-JAVA
--------------------
문서-Linux
문서-Powerbuilder
문서-JAVA
문서-ASP
문서-하드웨어
문서-EDPS
문서-MSSQL
--------------------
TIP-JAVA
TIP-Perl
TIP-ASP
TIP-Powerbuilder 01
TIP-Javascript
TIP-Excel
TIP-XML
TIP-MSAccess
TIP-PostgreSql
TIP-Windows
TIP-Linux
TIP-HTML
TIP-TOMCAT
--------------------
ETC
Secret
Util-Japan
미분류
최근 등록된 덧글
잘읽어 보았습니다. 그런..
by 이윤철 at 11/07
1000 666
by qhrlfeh77 at 05/21
123
by qhrlfeh77 at 05/21

by qhrlfeh77 at 05/21
감사합니다!! HashSet..
by 세레네이 at 04/06
찾고 있었던 자료인데 ..
by 나그네 at 01/09
감사합니다. 잘 보았습..
by 졸면죽는다 at 10/28
좋은 정보 정말 감사합니..
by 강성훈 at 10/22
좋은글 퍼가겠습니다.
by 정의진 at 09/29
이제야 봤습니다. iText..
by 제갈장비 at 08/09
이글루 파인더
Powered by egloos
rss

skin by 이글루스
2006년 09월 06일
돌연 관심을 끄는 녀석, Serializable 인터페이스
객체건 뭐건 결국 바이트의 흐름으로 전송하게 된다. 저장도 그렇고...
다시 읽었을 때 객체의 자료구조를 그대로 보존하지 않으면 객체 지향 프로그래밍은 없다.
자바에선 Serializable 인터페이스만 구현하면 알아서 이를 보장해준다.
일명 Serialzation

단지 implements Serializable 만 추가하면 되기에 이 녀석을 관심을 대상에서 배제된다.
공기가 흔해서 고마움을 모르듯이(?)

느닷없이 경고 문구를 보게되었다.
아마도 JDK 5.0 을 사용해서 나타나는 것이라 추정된다.




내가 만든 InvalidEmployeeNameException 클래스는 Exception을 상속받아서 자연스레 Serializable 인터페이스도 구현하게 된다. 늘 그냥 쓰던 것인데 새삼스레 경고가 뜬다. 에러는 아니지만 찜찜해서 코딩하다 말고 중간중간 이녀석을 해결할 것을 고민하게 된다.

경고는static final long 타입의 serialVersionUID 상수를 선언하라는 것이다.

API를 뒤척이다 관련된 내용을 찾았다. 지금 읽고 있다.

찾아보니 Serializable 인터페이스 이외의 경우에도 보안 등의 용도로 많이 쓰였다.
일종의 객체에 대한 지문(fingerprint)으로 이해할 수 있을 것 같다.

음... 중요한 내용인데 어설프게 정리했다가 오해의 소지가 날 수 있어서 일단 해석만 해야겠다.

Serializable 인터페이스를 구현한 클래스는 자신의 serialVersionUID를 명시적으로 선언할 수 있는데, 필드의 이름은 "serialVersionUID"이며, static, final 이어야 하며 long타입이다.

예) private(추천) static final long serialVersionUID = 42L;

만일 serialVersionUID를 지정하지 않으면 실행시점에서 serialization을 담당하는 모듈이 디폴트 값을 산정하게 되며, 그 알고리즘은 Java(TM) Object Serialization Specification 정의된 것을 따른다. 그러나 모든 serialization이 필요한 클래스에 명시적으로 serialVersionUID 값을 선언해줄 것을 강력하게 권유한다. 그 이유는  디폴트 serialVersionUID 계산은 클래스의 세부 사항을 매우 민감하게 반영하기 때문에 컴파일러 구현체에 따라서 달라질 수 있어 deserialization(serialization 했던 객체를 복구하는 과정)과정에서 예상하지 못한 InvalidClassExceptions을 유발할 수 있다.
그러므로, 서로 다른 자바 컴파일러 구현체 사이에서도 동일한 serialVersionUID 값을 얻기 위해서는 명시적으로  serialVersionUID 값을 선언해야 한다.가능한 serialVersionUID을 private으로 선언하기를 권장한다. 상속되어 쓰여지는 것은 유용하지 않고, 해당 클래스에서만 쓰일 것이기 때문이다.

원문: 출처는 Serializable 인터페이스 API
A serializable class can declare its own serialVersionUID explicitly by declaring a field named "serialVersionUID" that must be static, final, and of type long:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible, since such declarations apply only to the immediately declaring class--serialVersionUID fields are not useful as inherited members.

 

출처 : http://blog.empas.com/ahnyounghoe/read.html?a=6331421

# by 제갈장비 | 2006/09/06 13:30 | 문서-JAVA | 트랙백 | 덧글(1)
트랙백 주소 : http://dojeun.egloos.com/tb/317856
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 이윤철 at 2009/11/07 16:34
잘읽어 보았습니다. 그런데 질문이 있는데요, 이 serializable 인터페이스를 끌어다가 쓸때는 if and only if 그 static 번호를 자동 만들거나 혹은 만들거나 해야하잖아요. 근데요, 그번호가요, 해당 프로그램 안의 모든 클래스에다가 다 써야하는걸까요?
예로) A, B implements serializable (써야함), C(implements serializable (써야함), D (써야함?!), E (써야함?!), F(써야함?!)

*써야함은 그 고유 번호 임니다.

쓸까요 말까요?

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶

이글루링크 추가하기
()을(를)
이글루링크로 추가하시겠습니까? 추가하시려면 그룹선택을 하세요.
(그룹선택 하지 않는 경우, 최상단 목록에 추가됩니다.)
그룹선택 :
이글루링크 취소