source

Java에 Serializable 인터페이스가 필요한 이유

goodcode 2022. 9. 3. 13:16
반응형

Java에 Serializable 인터페이스가 필요한 이유

Seagate는 시리얼라이제이션에 많은 노력을 기울이고 있으며 사용하는 오브젝트마다 시리얼라이제이션 태그를 지정해야 하는 것은 부담스러운 일입니다.특히 서드파티 수업일 때는 정말 바꿀 수 없어요.

빈이며, 는 "Serializable"을 implements Serializable왜 걸 - 연재화 안 - 연재화 안 했을까? - 연재화 안 했을까? - 연재화 안 했을까?

제가 무엇을 빠뜨리고 있나요?

시리얼화에는 함정이 많다.이 폼의 자동 시리얼화를 지원하면 클래스 내부가 퍼블릭 API의 일부가 됩니다(이 때문에 javadoc은 클래스의 영속적인 형식을 제공합니다).

장기 지속성을 위해서는 클래스가 이 양식을 디코딩할 수 있어야 하며, 이로 인해 클래스 설계에 적용할 수 있는 변경이 제한됩니다.이로 인해 캡슐화가 해제됩니다.

시리얼라이즈로 인해 보안 문제가 발생할 수도 있습니다.참조가 있는 개체를 직렬화할 수 있으므로 클래스는 일반적으로 액세스할 수 없는 데이터에 액세스할 수 있습니다(결과 바이트 데이터를 구문 분석).

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

모든 클래스를 직렬화할 수 있도록 하는 것은 이러한 문제를 악화시킬 것입니다.효과적인 Java Second Edition, 특히 항목 74: 순차적으로 실행 가능을 신중하게 확인하십시오.

자바랑 둘 다.이번에는 넷 유저들이 잘못 알고 있기 때문에, 디폴트로 모든 것을 시리얼화 할 수 있도록 하고, 대신에 안전하게 시리얼화할 수 없는 클래스만을 표시하면 되는 것이 좋을 것입니다.

예를 들어 Smalltalk(70년대에 작성된 언어)에서는 기본적으로 모든 개체를 직렬화할 수 있습니다.대부분의 오브젝트는 시리얼라이즈 해도 안전하지만, 일부 오브젝트만 안전하지 않다는 점을 고려하면 Java에서는 왜 그렇지 않은지 모르겠다.

오브젝트에 (인터페이스를 사용하여) serializable로 표시한다고 해서 그 오브젝트가 마법처럼 시리얼라이즈 되는 것은 아닙니다.시리얼라이즈가 가능한 것은, 시스템이 스스로 검출했을 가능성이 있는 것을 나타내고 있기 때문에, 현재와 같이 시리얼라이즈가 필요한 진정한 이유는 없다고 생각합니다.

설계자가 내린 잘못된 결정이었거나, 시리얼화는 나중에 생각한 것이거나, 플랫폼이 기본적으로 모든 오브젝트에 대해 안전하고 일관성 있게 시리얼화를 수행할 준비가 되어 있지 않았다고 생각합니다.

모든 것이 정말로 연속 가능한 것은 아닙니다.예를 들어 네트워크 소켓 연결을 예로 들어 보겠습니다.소켓 오브젝트의 데이터/스테이트를 시리얼화할 수 있습니다만, 액티브한 접속의 본질은 없어집니다.

Java에서 Serializable의 주요 역할은 기본적으로는 다른 모든 개체를 Serializable이 아닌 상태로 만드는 것입니다.시리얼화는 특히 디폴트 실장에서는 매우 위험한 메커니즘입니다.따라서 C++의 우정과 마찬가지로 시리얼화 비용이 조금 들어도 기본적으로는 꺼집니다.

직렬화는 구조 호환성이 보장되지 않기 때문에 제약과 잠재적인 문제를 가중시킵니다.디폴트로 오프되어 있는 것은 좋은 일입니다.

나는 표준적인 시리얼라이제이션이 내가 원하는 것을 해내는 중요하지 않은 수업을 거의 본 적이 없다는 것을 인정해야 한다.특히 복잡한 데이터 구조의 경우에는 더욱 그렇습니다.그래서 당신이 수업의 연속화를 위해 소비하는 노력은 인터페이스 추가 비용을 적절히 낭비한다.

일부 클래스(특히 파일, 소켓, 스레드 또는 DB 연결과 같은 보다 물리적인 것을 나타내는 클래스)에서는 인스턴스를 직렬화하는 것이 전혀 의미가 없습니다.그 외의 많은 경우, 시리얼라이제이션은 일의의 제약조건을 파괴하거나 단순히 다른 버전의 클래스 인스턴스를 처리하도록 강요하기 때문에 문제가 될 수 있습니다.

디폴트로는 모든 것을 Serialable로 하고 키워드나 마커 인터페이스를 통해 클래스를 Serialable로 하지 않는 것이 좋을지도 모릅니다만, 그 옵션을 사용하는 사람은 아마 생각하지 않을 것입니다.즉, 시리얼 가능을 실장할 필요가 있는 경우는, 예외에 의해서 실장할 수 있습니다.

프로그래머로서 당신의 목표가 연재된다는 것을 확실히 하기 위해서라고 생각합니다.

일부 예비 설계에서는 모든 것을 직렬화할 수 있었지만, 보안과 정확성에 대한 우려 때문에 최종 설계는 모두 아시다시피 끝났습니다.

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

특정 클래스의 인스턴스가 직렬화 가능함을 설명해야 하는 경우 언어를 통해 이를 허용해야 하는지 여부를 생각하게 됩니다.단순한 가치 개체의 경우 일련화는 사소한 것이지만, 더 복잡한 경우에는 자세히 생각해 보아야 합니다.

JVM의 표준 직렬화 지원에만 의존하면 모든 종류의 심각한 버전 관리 문제에 노출됩니다.

고유성, '실제' 리소스, 타이머 및 기타 많은 유형의 아티팩트는 시리얼라이제이션 대상이 아닙니다.

Serializable Interface를 읽고 몇 개의 클래스만 Serializable로 만들어야 하는 이유와 저장 절차에서 몇 개의 필드를 삭제하려는 경우 transient 키워드를 사용하는 위치에 유의하십시오.

http://www.codingeek.com/java/io/object-streams-serialization-deserialization-java-example-serializable-interface/

글쎄, 내 대답은 이건 좋은 이유가 아니라는 거야.그리고 당신의 코멘트를 보면 당신은 이미 그것을 배웠다는 것을 알 수 있습니다.다른 언어에서는 10까지 세면 나무에 올라가지 않는 모든 것을 기꺼이 연재하려고 합니다.개체는 기본적으로 직렬화 가능해야 합니다.

따라서 기본적으로 필요한 것은 서드파티 클래스의 모든 속성을 직접 읽는 것입니다.또는 디컴파일하고 decompile 키워드를 입력한 후 다시 컴파일하는 옵션도 있습니다.

Java에는 런타임에 따라 달라서 직렬화할 수 없는 것이 있습니다.스트림, 스레드, 런타임 등 일부 GUI 클래스(기본 OS에 연결되어 있음)는 시리얼화할 수 없습니다.

다른 답변에서는 동의하지만, 진짜 문제는 역직렬화입니다.클래스 정의가 변경되면 역직렬화가 제대로 작동하지 않을 위험이 있습니다.기존 필드를 수정하지 않는 것은 라이브러리 작성자에게 매우 중요한 작업입니다.API 호환성을 유지하는 것은 현재로선 귀찮은 일입니다.

파일 또는 다른 미디어에 유지되어야 하는 클래스는 JVM이 클래스 개체를 직렬화할 수 있도록 Serializable 인터페이스를 구현해야 합니다.Object Output Stream을 사용하는 경우에만 모든 JVM이 클래스를 시리얼화한 후 오브젝트 클래스가 시리얼화되지 않은 이유는 JVM이 시리얼화하도록 하기 위한 제어가 아직 내 수중에 있음을 의미합니다.

오브젝트 클래스가 디폴트로 시리얼 가능하지 않은 이유는 클래스 버전이 주요 문제이기 때문입니다.따라서 시리얼라이제이션에 관심이 있는 각 클래스는 Serializable로 명시적으로 마크하고 버전 번호를 serialVersion으로 지정해야 합니다.UID.

serialVersion의 경우UID가 제공되지 않는 경우 오브젝트를 역직렬화하는 동안 예기치 않은 결과가 표시되므로 serialVersion의 경우 JVM에서 InvalidClassException이 느려집니다.UID가 일치하지 않습니다.따라서 모든 클래스는 Serialable 인터페이스를 구현하고 serialVersion을 제공해야 합니다.UID: 양 끝에 표시되는 클래스가 동일한지 확인합니다.

언급URL : https://stackoverflow.com/questions/441196/why-java-needs-serializable-interface

반응형