[java] 언제 Serializable 인터페이스를 구현해야합니까?

public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. Serializable인터페이스 는 언제 구현해야 합니까?
  2. 왜 그렇게합니까?
  3. 그것은 어떤 장점이나 보안을 제공합니까?


답변

  1. 에서 모든 약이 “직렬화”일이 무엇입니까? :

    객체 또는 객체 그룹을 가져 와서 디스크에 넣거나 유선 또는 무선 전송 메커니즘을 통해 전송 한 다음 나중에 다른 컴퓨터에서 프로세스를 되돌릴 수 있습니다. 원래 객체를 부활시킵니다. 기본 메커니즘은 객체를 1 차원 비트 스트림으로 평탄화하고 비트 스트림을 원래 객체로 되 돌리는 것입니다.

    Star Trek의 Transporter와 마찬가지로 복잡한 것을 가져 와서 1과 0의 평평한 시퀀스로 바꾸고 1과 0의 시퀀스를 다른 장소에서 아마도 다른 시간에 가져 와서 원래의 복잡한 ” 어떤 것.”

    따라서 Serializable객체의 사본을 저장해야 할 때 인터페이스를 구현하고 동일한 시스템 또는 네트워크를 통해 실행되는 다른 프로세스로 보냅니다.

  2. 객체를 저장하거나 보내려고하기 때문입니다.

  3. 객체를 쉽게 저장하고 보낼 수 있습니다. 보안과는 아무런 관련이 없습니다.


답변

  1. Serializable클래스의 인스턴스를 일련의 바이트로 변환하거나 Serializable객체가 클래스의 인스턴스를 참조 할 수 있다고 생각할 때 인터페이스를 구현하십시오 .

  2. Serializable 클래스는 인스턴스를 유지하거나 유선으로 전송할 때 유용합니다.

  3. Serializable클래스의 인스턴스를 쉽게 전송할 수 있습니다. 그러나 직렬화에는 몇 가지 보안 결과가 있습니다. Joshua Bloch의 효과적인 Java를 읽으십시오 .


답변

이 질문에 대한 답은 놀랍게도이며, 결코 , 또는 더 현실적으로 당신이 레거시 코드와의 상호 운용성을 위해 강제 경우에만 . 다음은 Joshua Bloch의 Effective Java, 3 판 의 권장 사항입니다 .

새로운 시스템에서 Java 직렬화를 사용할 이유가 없습니다.

오라클의 수석 설계자 Mark Reinhold 는 현재 Java 직렬화 메커니즘을 제거하는 것이 장기적인 목표라고 기록 하고 있습니다.


Java 직렬화에 결함이있는 이유

Java는 Serializable인터페이스 를 사용하여 선택할 수있는 직렬화 체계를 언어의 일부로 제공합니다 . 그러나이 체계에는 몇 가지 다루기 힘든 결함이 있으므로 Java 언어 디자이너는 실패한 실험으로 간주해야합니다.

  • 기본적 으로 객체 직렬화 된 형태에 대해 이야기 할 수 있다고 가정 합니다. 그러나 직렬화 체계가 무한히 많아서 직렬화 된 형태가 무한히 많습니다. 구성표를 변경하는 방법없이 하나의 구성표를 적용하면 응용 프로그램에서 가장 적합한 구성표를 사용할 수 없습니다.
  • 생성자를 생성하거나 팩토리 메소드가 수행하는 모든 전제 조건 검사를 무시하는 오브젝트를 구성하는 추가 수단으로 구현됩니다. 까다 롭고, 오류가 발생하기 쉽고, 역 직렬화 코드를 테스트하기 어려운 경우가 아니면 코드에 보안 취약점이있을 수 있습니다.
  • 다른 버전의 직렬화 된 양식의 상호 운용성을 테스트하는 것은 매우 어렵습니다.
  • 불변 개체의 처리는 번거 롭습니다.

대신해야 할 일

대신 명시 적으로 제어 할 수있는 직렬화 체계를 사용하십시오. 프로토콜 버퍼, JSON, XML 또는 사용자 지정 구성표와 같은


답변