Hashtable.ondeserialization
-
07-07-2019 - |
문제
나는 Maintans에게 해시 가능에 대한 참조를하고 해시 가능을 일련화/사형화하는 수업이 있습니다. SerializationInfo.getValue를 호출 한 후, 해시 가능은 Ideserialization Calback 동안 사막화가 발생하기 때문에 완전히 사막화되지 않습니다.
Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));
또한 상위 클래스에서 Ideserialization 콜백을 구현했지만 해시 가능도 아직 완전히 사막화되지 않았습니다. 내부에서 사막화가 일어나고 있다면 나는 그것이 될 것으로 예상했다.
내 질문은, 부모 클래스의 ondeserialization 메소드에서 hashtable.ondeserialization을 설명하여 그 시점에서 그것을 열거 할 수 있도록 안전하게 호출하는 것이 안전합니까?
public virtual void OnDeserialization(object sender)
{
hashtable.OnDeserialization(sender);
}
해결책
이것은 정말 흥미로운 문제입니다. 리플렉터로 직렬화 코드를 확인한 후, 추천 클래스가 ideSerializationCallback을 사용하는 경우 일반적으로 좋은 Soluiton이 없다고 생각합니다.
아마도 당신은 아마도 사막화 중에 코드를 실행하는 다른 두 가지 방법, [ondeserializing] 및 [ondeserialized] 속성이 있음을 알았을 것입니다. 불행히도 둘 다 ideSerializationCallback.ondeserialization () 전에 실행됩니다. Class2를 나타내는 클래스 1이있는 경우 메소드의 실행 순서입니다.
Class1: [OnDeserializing]
Class2: [OnDeserializing]
Class2: [OnDeserialized]
Class1: [OnDeserialized]
Class1: IDeserializationCallback.OnDeserialization
Class2: IDeserializationCallback.OnDeserialization
보시다시피, [ondeserializing]과 [ondeserialized] 속성은 일관성이 있지만 IdeserializationCallback 방법은 실제로 ... :(
또한 해시 테이블 및 사전의 ondeserialization 구현을 확인했으며, 둘 다 온도 화를 한 번 이상 호출하는 데 안전한 것 같습니다 (첫 번째 호출 만 필요한 작업을 수행하면 후속 통화는 아무것도하지 않습니다).
마지막으로, 당신은 hashtable의 ondeserialization ()를 호출해야합니다. 숀 그리고 브라이언은 제안했다.
다른 팁
나는 당신이 이미 Googled를했다고 생각하지만 나는 이것 어제 패턴.
public BoringClass(SerializationInfo info, StreamingContext context)
{
Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));
hashtable.OnDeserialization(this);
Console.WriteLine("Value is: " + hashtable["testItem"]);
}