Serializable Interface는 언제 구현해야 합니까?
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;
}
}
- 언제 구현해야 합니까?
Serializable
인터페이스? - 왜 그래야 하죠?
- 장점이나 안전성이 있습니까?
-
오브젝트 또는 오브젝트 그룹을 가져와 디스크에 저장하거나 와이어 또는 무선 전송 메커니즘을 통해 전송할 수 있습니다.그 후, 다른 컴퓨터에서는, 원래의 오브젝트를 부활시킵니다.기본 메커니즘은 객체를 1차원 비트 스트림으로 평탄화하고 해당 비트스트림을 원래 객체로 되돌리는 것입니다.
스타트렉의 트랜스포터처럼 복잡한 것을 1과 0의 평탄한 시퀀스로 만든 다음, 1과 0의 시퀀스(아마도 다른 장소에서, 아마도 다른 시간에)를 가져와서 원래의 복잡한 "뭔가"를 재구성하는 것이다.
이 때문에,
Serializable
오브젝트 복사본을 저장해야 할 경우 동일한 시스템 또는 네트워크를 통해 실행되는 다른 프로세스로 전송합니다. 객체를 저장하거나 전송하기 때문입니다.
물건을 쉽게 저장하고 보낼 수 있습니다.보안과는 아무 상관이 없습니다.
이 질문에 대한 대답은 아마도 놀랍게도 전혀, 또는 보다 현실적으로 레거시 코드와의 상호 운용성을 위해 강제되었을 때에만 가능합니다.다음은 Joshua Bloch의 Effective Java, 3rd Edition 권장 사항입니다.
작성한 새로운 시스템에서 Java 시리얼화를 사용할 이유가 없습니다.
Oracle의 수석 설계자인 Mark Reinhold는 현재 Java의 직렬화 메커니즘을 제거하는 것이 장기적인 목표라고 말했습니다.
Java 시리얼화에 결함이 있는 이유
Java는 언어의 일부로서 사용자가 선택할 수 있는 시리얼라이제이션스킴을 제공합니다.Serializable
인터페이스입니다.그러나 이 스킴에는 몇 가지 다루기 어려운 결함이 있으며 Java 언어 설계자에 의해 실패한 실험으로 취급되어야 합니다.
- 기본적으로는 개체의 직렬화된 형식에 대해 말할 수 있는 것처럼 가장합니다.그러나 직렬화 방식은 무한히 많으며, 결과적으로 직렬화된 형식이 무한히 많습니다.스킴을 변경하지 않고 하나의 스킴을 적용함으로써 어플리케이션은 자신에게 가장 적합한 스킴을 사용할 수 없습니다.
- 이는 오브젝트를 구성하는 추가 수단으로 구현되며 컨스트럭터 또는 공장 메서드가 수행하는 사전 조건 체크를 생략합니다.까다롭고 오류 발생 가능성이 높으며 추가 역직렬화 코드를 테스트하기 어려운 경우가 아니라면 코드에는 보안상의 취약점이 있을 수 있습니다.
- 시리얼라이즈드 폼의 다른 버전의 상호 운용성을 테스트하는 것은 매우 어렵습니다.
- 불변의 물건을 취급하는 것은 귀찮다.
대신 해야 할 일
대신 명시적으로 제어할 수 있는 시리얼화 방식을 사용합니다.예를 들어 Protocol Buffers, JSON, XML 또는 사용자 지정 스킴이 있습니다.
「 」의 실장
Serializable
할 수 "클래스 를 일련의 바이트로 변환할 수 있다고Serializable
오브젝트가 클래스의 인스턴스를 참조할 수 있습니다.Serializable
클래스는 클래스의 인스턴스를 유지하거나 회선을 통해 전송할 때 유용합니다.의
Serializable
수업은 쉽게 전달될 수 있다.다만, 시리얼화는 시큐러티상의 영향을 미칩니다.Joshua Bloch의 Effective Java를 읽어보십시오.
언급URL : https://stackoverflow.com/questions/4548816/when-should-we-implement-serializable-interface
'IT이야기' 카테고리의 다른 글
memset은 어떻게 정수 배열을 -1로 초기화합니까? (0) | 2022.06.07 |
---|---|
v-autocomplete 너비를 변경할 수 있습니까? (0) | 2022.06.07 |
Vuex에 액세스하여 vue 라우터의 모듈 getter를 지연시켰습니다. (0) | 2022.06.07 |
GCC를 사용한 실행 파일에 리소스 내장 (0) | 2022.06.06 |
Vuex 스토어에서 모듈 액세스 (0) | 2022.06.06 |