transient
으로 표시 되더라도 필드가 Hashtable
인 이유는 무엇입니까?Hashtable의 테이블 특성이 직렬화되는 이유는 무엇입니까?
답변
Entry 배열에서 기본 직렬화 체계를 사용하는 것이 안전하지 않으므로 일시적으로 표시됩니다. 대신 Hashtable을 deserialize 할 때 테이블의 키를 다시 해시하고 항목을 새 해시 코드 값에 따라 슬롯에 추가해야합니다. 이유는 여러 가지 이유로 직렬화 후에 키가 다른 해시 코드를 가질 수 있기 때문에 필요합니다. 이 작업은 Hashtable의 readObject()
메서드로 수행됩니다.
더 일반적으로 구현과 직렬화 형식 간의 종속성을 줄여 전자 형식이 변경 될 수 있도록합니다. 직렬화에 대해 생각하지 못했던 추악한 해킹을 볼 수 있습니다. –
writeObject()
및 readObject()
이 구현되어 (개인 메서드로) 구현되어 있으므로 직렬화 및 비 직렬화 방법을 제어 할 수 있습니다. Java 1.6 소스 코드에서 800 행 정도입니다.
"후드 아래에서"작동하는 방법에 대한 자세한 내용은 Sun advanced serialization guide을 확인하십시오.
당신은 (적어도 1.6) Hashtable의 클래스의 소스 코드를 보면은 Entry[] table
는 transient
로 표시되어 있지만 클래스는 ObjectOutputStream
에 엔트리 테이블의 내용을 기록하는 writeObject()
을 구현합니다.
따라서 Hashtable의 내용은 항상 직렬화됩니다.
왜 이런 방식으로 구현 했습니까? 배열이 직렬화되는 방식을 제어 할 가능성이 있습니다.
코드 샘플 및 Java 버전이 귀하의 질문에 도움이 될 것입니다. – msw
@msw - 정말 아닙니다. 자바에 익숙한 사람은 누구나 Hashtable의 소스 코드를 어디에서 찾을 수 있는지 알고 있습니다. –