readObject?
readObject 메소드는 대응하는 writeObject 메소드에 의해 스트림에 기입해진 데이터를 사용해, 그 특정의 클래스의 오브젝트의 상태를 읽어 복원합니다. 이 메소드는 슈퍼 클래스 또는 서브 클래스에 속하는 상태와 관련 될 필요가 없습니다. 상태는 개별 필드의 ObjectInputStream에서 데이터를 읽고 객체의 해당 필드에 할당하여 복원됩니다. 원시적 데이터 형의 read는, DataInput에 의해 서포트됩니다. (https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html)
즉, 객체를 읽어 옵니다.
readObject메서드를 구현하고자 할 때 따라야 하는 지침
· private로 남아 있어야 하는 개체 참조 필드를 가진 클래스는 그런 필드가 가리키는 개체를 방어적으로 복사해야한다.
ㄴ 변경 불가능 클래스의 변경 가능 컴포넌트가 이 범주에 해당한다.
· 불변식을 검사해서 위반된 사실이 감지될 경우 InvalidObjectException을던져라.
ㄴ 불변식 검사는 방어적 복사 이후에 시행해야 한다.
· 만일 개체를 완전히 역직렬화 한 다음에 전체 객체 그래프의 유효성을 검사해야 한다면 ObjectInputValidation인터페이스를 이용하라.
· 직접적이건 간접적이건, 재정의 가능 메서드를 호출하지 마라.
결론
· 객체를 역으로 직렬화 할 때는 클라이언트가 가질 수 없어야 하는 개체참조를 담은 모든 필드를 방어적으로 복사하도록 해야 한다.
· writeUnshared와 readUnshared메서드는 사용하지 마라. 안전성을 제공하지 못한다.
'IT > Programming' 카테고리의 다른 글
<Effective Java> RULE 74 Serializable 인터페이스를 구현할 때는 신중하라 (0) | 2023.04.25 |
---|---|
<Effective Java> RULE 75 사용자 지정 직렬화 형식을 사용하면 좋을 지 따져 보라 (0) | 2023.04.25 |
<Effective Java> RULE 77 개체 통제가 필요하다면 readResolve 대신 enum자료형을 이용하라. (0) | 2023.04.25 |
<Effective Java> RULE 78 직렬화된 객체 대신 직렬화 프록시를 고려해 보라 (1) | 2023.04.25 |
[JAVA] helloworld print 예제 (0) | 2023.04.25 |