2012-07-22 4 views
31

가능한 중복 :
Why Java needs Serializable interface?Java.lang.Object가 Serializable 인터페이스를 구현하지 않는 이유는 무엇입니까?

직렬화에 따르면 자바 문서에서 : 클래스의

직렬화는 를 java.io.Serializable를 구현하는 클래스에 의해 유효하게됩니다 인터페이스. 이 인터페이스를 구현하지 않는 클래스의 상태의 직렬화 또는 직렬화 복원이되지 않습니다. 직렬화 클래스의 모든 아형 자체 직렬화합니다. 시리얼 인터페이스는

왜 개체가 이미 Serializable를 구현하지 않는 직렬화 가능한 것을 식별, 메소드 또는 필드가 없으며 만 제공? 우리가 직렬화 가능 싶지 않은 회원은 transient로 만들어 질 수있다. 기본 직렬화 가능성을 방지해야하는 이유는 무엇입니까? 직렬화 클래스의

+2

[이 질문에] (http://stackoverflow.com/questions/441196/why-java-needs-serializable-interface) 당신에게 흥미로운 몇 가지 좋은 답변이 포함되어 있습니다. – Pshemo

+0

사실. 게시하기 전에 대체 키워드를 사용해 보았습니다. :) –

답변

40

모든 하위 유형 자체 직렬화합니다. 즉

: 당신이 이제까지 만들 모든 수업이었다 또는 모든 직렬화되어 생성됩니다. transient은 전체 클래스가 아닌 필드 만 제외합니다.

이것은 잠재적 인 보안 구멍입니다 - 우연의 일치에 의해 당신이 예를 들어, 직렬화 할 수 내부 데이터베이스 자격 증명을 사용하여 DataSource -이 특정 DataSource 구현의 창조자는 필드 transient을 깜빡합니다. 랜덤 자바 객체를 직렬화하는 것은 놀랍도록 쉽습니다. 바깥 쪽 this에 암시적인 참조를 유지하는 내부 클래스를 통해.

명시 적으로 원하는 코드를주의 깊게 살펴 보는 대신 명시 적으로 직렬화 할 수있는 클래스의 흰색 목록을 사용하는 것이 더 안전합니다. 원하지 않는 필드를 직렬화하지 않도록하십시오.

MySuperSecretClass은 (Serializable을 구현하지 않음으로써) 직렬화 할 수 없다는 말은 더 이상 할 수 없습니다. - 용기 (필드) 만 제외 할 수 있습니다.

+0

알았어, 나는 완전히 그것의 보안 측면을 놓친 것 같아. 말이된다. 하지만 컴파일 타임 액세스에 Private/Public/Protected를 사용하지 마십시오. 일시적이거나 비슷한 것이 런타임에 위임되었습니다. 그냥 물어 보는 건데. 아니면 그냥 성가신 일이었을까요? –

+3

@ TJ- : IMHO 클래스 중 소수만 직렬화 할 수 있어야합니다 (값 객체, DTO). 직렬화 할 필요가있는 클래스를 마크하는 것이, 그다지 편리하지 않은 클래스를 표시하는 것보다 훨씬 편리합니다. 그 문제에서 Java는 성가신 일이 아닙니다. 다시 IMHO 모든 필드는 비공개이어야하며 기본적으로 모든 메소드가 공개되어야합니다.하지만 어떻게 할 수 있습니까? –

5

대부분의 클래스는 직렬화 할 필요가 없습니다. 현재 디자인에서는 클래스가 직렬화 가능하다는 것을 쉽게 알 수 있습니다. 본질적으로 이것은 컴파일러가 확인한 자체 문서 일뿐입니다. 그렇지 않으면 아마도 다음과 같이 쓸 것입니다 :

/** DON'T SERIALIZE IT!!! */ 
class Connection { ... } 

그리고 코멘트보다 언어 또는 라이브러리 기능을 사용하는 것이 좋습니다.

1

Serializable을 유지해야하는 객체에 구현하는 것이 더 바람직하며 클래스 transiennt의 모든 필드를 선언하는 것이 더 복잡 할 것이라고 생각합니다. 또 다른 요지는 Object이 리플렉션 관련 클래스를 포함하는 모든 클래스의 루트이므로 Object 클래스에 대해 Serializable을 구현하는 것은 부적절 할 것이라는 점입니다.

13

1.Serializable마커 인터페이스입니다. 클래스는 비어 있지만 클래스가 Serializable로 표시되어 해당 객체가 Serializable임을 나타냅니다. java.lang.Object의 직렬화를 구현 didnt는

2 이유는 당신이 직렬화와 같은 특정 필드를 만들고 싶어하지 않으면 어떻게 때문입니다 당신은 내 실수가 해당 필드에 과도를 추가하는 놓친, 다음이 될 것이다 큰 파란.

프로그래머가 자신의 클래스에 대해 Serializable을 구현하게함으로써 프로그래머가 의식적으로 구현했다고 인식하고, 다음과 같이 직렬화되지 않도록해야합니다.

관련 문제