2010-03-26 1 views

답변

7

Entry 배열에서 기본 직렬화 체계를 사용하는 것이 안전하지 않으므로 일시적으로 표시됩니다. 대신 Hashtable을 deserialize 할 때 테이블의 키를 다시 해시하고 항목을 새 해시 코드 값에 따라 슬롯에 추가해야합니다. 이유는 여러 가지 이유로 직렬화 후에 키가 다른 해시 코드를 가질 수 있기 때문에 필요합니다. 이 작업은 Hashtable의 readObject() 메서드로 수행됩니다.

+0

더 일반적으로 구현과 직렬화 형식 간의 종속성을 줄여 전자 형식이 변경 될 수 있도록합니다. 직렬화에 대해 생각하지 못했던 추악한 해킹을 볼 수 있습니다. –

1

writeObject()readObject()이 구현되어 (개인 메서드로) 구현되어 있으므로 직렬화 및 비 직렬화 방법을 제어 할 수 있습니다. Java 1.6 소스 코드에서 800 행 정도입니다.

"후드 아래에서"작동하는 방법에 대한 자세한 내용은 Sun advanced serialization guide을 확인하십시오.

+0

고마워요. 왜 그것이 일시적이라고 선언되는지 당신은 나에게 말할 수 있습니까? – ppoliani

+1

"자동으로"직렬화되어 데이터 중복을 일으키지 않습니다. – BalusC

+0

괜찮아, 내가 다시 덮어 줘, 고마워! – ppoliani

1

당신은 (적어도 1.6) Hashtable의 클래스의 소스 코드를 보면은 Entry[] tabletransient로 표시되어 있지만 클래스는 ObjectOutputStream에 엔트리 테이블의 내용을 기록하는 writeObject()을 구현합니다.

따라서 Hashtable의 내용은 항상 직렬화됩니다.

왜 이런 방식으로 구현 했습니까? 배열이 직렬화되는 방식을 제어 할 가능성이 있습니다.