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


153
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
참고로 여기에 허용 된 답변은 보안상의 단점을 해결하지 못하기 때문에 불완전하고 오해의 소지가 있습니다. 효과적인 Java , 항목 86 : 직렬화 가능 구현에 각별히주의하십시오.를 참조하십시오 . 직렬화를 사용하지 않는다고 말하는 Raedwald의 대답 은 맞습니다.
Nathan Hughes

답변:


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

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

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

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

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

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


4
모든 도메인 모델에 대해 seriablizble 인터페이스를 구현하는 것이 가장 좋은 방법입니까?
theJava

8
@theJava 모범 사례에 대한 질문이 아닙니다. 일련의 바이트가 필요한지 여부에 대한 질문입니다.
moinudin

5
JSON을 사용할 때이 인터페이스를 구현할 필요가없고 단순히 해당 문자열을 보낼 수 있습니다. 따라서 JSON을 사용할 수있을 때이 인터페이스를 사용해야하는 이유는 여전히 확실하지 않습니다.
Yonatan Nir

1
@YonatanNir MsgPack, Avro, Thrift 또는 Protobuf가 IO 전송에 더 좋을 때 JSON을 사용하는 이유가 확실하지 않습니다.
OneCricketeer

1
@YonatanNir 엄격하게 정의 된 스키마가 더 좋습니다. 그리고 JSON은 사람이 읽을 수 있어야하며 바이너리 인코딩 형식은 훨씬 효율적입니다.
OneCricketeer

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

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

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


32

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

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

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


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

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

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

대신해야 할 일

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


2
그 수준의 전문가는 아니지만 요점이 있다고 생각합니다.
nightfury

1
나는 그것이 최선의 대답이라고 생각합니다!
jjanczur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.