java - 직렬화 가능에 정의된 클래스를 직렬화할 수 없는 이유는 무엇입니까?
欧阳克
欧阳克 2017-06-30 09:56:37
0
2
1260

직렬화 가능 클래스의 필드는 클래스가 명시적으로 직렬화되거나 역직렬화되지 않은 경우에도 직렬화 가능하거나 일시적이어야 합니다. 그 이유는 로드 시 대부분의 J2EE 애플리케이션 프레임워크가 개체를 디스크에 플러시하고, 일시적이지 않고 직렬화할 수 없는 데이터 멤버가 포함된 직렬화 가능 개체로 인해 프로그램 충돌이 발생하고 공격자에게 문이 열릴 수 있기 때문입니다.

이 규칙은 직렬화 가능하지 않은 필드, 비공개가 아닌 컬렉션 필드(외부에서 직렬화 가능하지 않은 값을 할당할 수 있기 때문에), 클래스 내에서 직렬화 가능하지 않은 유형을 할당할 때 문제를 발생시킵니다.

비준수 코드 예

으아악
欧阳克
欧阳克

温故而知新,可以为师矣。 博客:www.ouyangke.com

모든 응답(2)
扔个三星炸死你

객체가 직렬화되면 Java의 기본 직렬화 규칙에 따라 객체의 모든 멤버가 직렬화되어야 합니다. 즉, 이러한 클래스는 직렬화 가능을 구현해야 합니다.

그래서 수정하는 방법은 두 가지가 있습니다. 하나는 Address에 Serialized 인터페이스를 구현하는 것이고, 다른 하나는 Person의 주소 멤버에 transient 표시를 추가하여 해당 멤버가 직렬화되지 않도록 하는 것입니다.

typecho

주소 멤버를 직렬화해야 하는 경우 주소 클래스도 Serialized 인터페이스를 구현해야 합니다.
주소 멤버를 직렬화할 필요가 없는 경우 transient 키워드를 추가하면 주소 멤버가 직렬화되지 않고 값이 null이 됩니다. 다음과 같습니다:

으아악

물론 다른 방법도 있습니다:
예를 들어 Externalized 인터페이스를 구현하고 readExternal(ObjectInput in) 및 writeExternal(ObjectOutput out) 메서드를 재정의합니다.
또한 Externalized인터페이스 메소드의 대체 구현이 있거나 writeObject(ObjectOutputStream obs) 및 readObject(ObjectInputStream ois) 메소드를 추가하여 Serialized 인터페이스를 구현하는 방법도 있습니다.


주소가 Serialized를 구현해야 하는 이유를 다시 말해주세요. 아니면 직렬화하기 위해 transient 키워드 Person을 추가해야 하나요?
먼저 처리 없이 객체를 유지하기 위해 ObjectOutputStream을 사용하여 발생한 예외를 살펴보겠습니다.

으아악

보기 ObjectOutputStream소스 코드:

으아악

작성되는 객체 유형이 String, Array, Enum 또는 Serialized인 경우 직렬화할 수 있고, 그렇지 않으면 NotSerializedException이 발생함을 알 수 있습니다. 그리고 객체를 직렬화하면 현재 객체 자체도 직렬화될 뿐만 아니라 해당 객체가 참조하는 다른 객체도 직렬화됩니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿