[java] Java에 직렬화 가능한 인터페이스가 필요한 이유는 무엇입니까?

우리는 직렬화를 많이 사용하며 사용하는 모든 객체에 직렬화 가능 태그를 지정해야하는 것은 부담이됩니다. 특히 우리가 실제로 변경할 수없는 제 3 자 클래스 일 때.

질문은 : Serializable은 빈 인터페이스이고 Java는 일단 추가하면 강력한 직렬화를 제공 implements Serializable하기 때문에 모든 것을 직렬화 가능하게 만들지 않은 이유는 무엇입니까?

내가 무엇을 놓치고 있습니까?



답변

직렬화에는 함정이 있습니다. 이 형식의 자동 직렬화 지원은 클래스 내부를 공용 API의 일부로 만듭니다 (이것이 javadoc 이 클래스지속 된 형식을 제공하는 이유 입니다 ).

장기 지속성을 위해 클래스는이 양식을 디코딩 할 수 있어야하며, 이는 클래스 디자인에 적용 할 수있는 변경 사항을 제한합니다. 이것은 캡슐화를 깨뜨립니다.

직렬화는 보안 문제로 이어질 수도 있습니다. 참조가있는 모든 객체를 직렬화 할 수 있으므로 클래스는 일반적으로 할 수없는 데이터에 액세스 할 수 있습니다 (결과 바이트 데이터를 구문 분석하여).

내부 클래스의 직렬화 된 형식이 제대로 정의되지 않는 것과 같은 다른 문제가 있습니다.

모든 클래스를 직렬화 가능하게 만들면 이러한 문제가 악화됩니다. 체크 아웃 효과적인 자바 Second Edition의 , 특히 항목 74 : 직렬화를 적절하게 구현합니다 .


답변

이번에는 Java와 .Net 사람들이 모두 잘못 알고 있다고 생각합니다. 기본적으로 모든 것을 직렬화 할 수 있도록하고 대신 안전하게 직렬화 할 수없는 클래스 만 표시하면되었을 것입니다.

예를 들어 Smalltalk (70 년대에 만들어진 언어)에서는 모든 객체가 기본적으로 직렬화 가능합니다. 대부분의 객체가 직렬화하기에 안전하고 일부만 그렇지 않다는 사실을 고려할 때 Java에서 이것이 왜 그렇지 않은지 모르겠습니다.

객체를 직렬화 가능 (인터페이스 사용)으로 표시하는 것은 마술처럼 객체를 직렬화 할 수있는 것이 아닙니다. 계속해서 직렬화 가능 했습니다. 이제 시스템이 스스로 발견 할 수있는 것을 표현했기 때문입니다. 직렬화는 지금의 방식입니다.

디자이너가 내린 잘못된 결정이거나 직렬화가 나중에 고려되었거나 플랫폼이 기본적으로 모든 객체에 대해 안전하고 일관되게 직렬화를 수행 할 준비가되지 않았다고 생각합니다.


답변

모든 것이 진정으로 직렬화 가능한 것은 아닙니다. 예를 들어 네트워크 소켓 연결을 사용하십시오. 소켓 객체의 데이터 / 상태를 직렬화 할 수 있지만 활성 연결의 본질은 손실됩니다.


답변

Java에서 Serializable의 주요 역할은 기본적으로 다른 모든 객체를 직렬화 불가능하게 만드는 것입니다. 직렬화는 특히 기본 구현에서 매우 위험한 메커니즘입니다. 따라서 C ++의 우정과 마찬가지로 직렬화 가능하게 만드는 데 약간의 비용이 들더라도 기본적으로 꺼져 있습니다.

직렬화는 구조 호환성이 보장되지 않기 때문에 제약 조건과 잠재적 인 문제를 추가합니다. 기본적으로 꺼져있는 것이 좋습니다.

나는 표준 직렬화가 내가 원하는 것을 수행하는 사소한 클래스를 거의 보지 못했다는 것을 인정해야한다. 특히 복잡한 데이터 구조의 경우. 따라서 클래스 직렬화를 적절하게 만드는 데 드는 노력은 인터페이스 추가 비용을 줄여줍니다.


답변

일부 클래스, 특히 파일, 소켓, 스레드 또는 DB 연결과 같이 더 물리적 인 것을 나타내는 클래스의 경우 인스턴스를 직렬화하는 것은 전혀 의미가 없습니다. 다른 많은 경우 직렬화는 고유성 제약 조건을 파괴하거나 단순히 원하지 않는 클래스의 다른 버전의 인스턴스를 처리하도록 강제하기 때문에 문제가 될 수 있습니다.

논란의 여지가 있지만, 기본적으로 모든 것을 Serializable로 만들고 키워드 또는 마커 인터페이스를 통해 클래스를 직렬화 할 수 없게 만드는 것이 더 나았을 수도 있지만,이 옵션을 사용해야하는 사람들은 아마 그것에 대해 생각하지 않을 것입니다. 즉, Serializable을 구현해야하는 경우 Exception이 표시됩니다.


답변

나는 프로그래머로서 당신의 객체가 내가 직렬화된다는 것을 알고 있는지 확인하는 것이라고 생각합니다.


답변

분명히 모든 것이 일부 예비 설계에서 직렬화 가능했지만 보안 및 정확성 문제로 인해 최종 설계는 우리 모두가 알고있는대로 끝났습니다.

출처 : ObjectOutputStream에 작성하기 위해 클래스가 Serializable을 구현해야하는 이유는 무엇입니까? .