Pergunta

Eu tenho uma classe que maintans uma referência a uma tabela de hash e Serializa / desserializa que Hashtable. Após a chamada para SerializationInfo.GetValue, o Hashtable não é totalmente desserializado porque a desserialização acontece durante o Calback IDeserialization.

Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));

Eu também implementou o callback IDeserialization na classe pai, mas há também o Hashtable não é ainda totalmente desserializado. Eu esperava que fosse se a desserialização está acontecendo desde o fora para dentro.

A minha pergunta é, é seguro Hashtable.OnDeserialization chamada explicitamente a partir do método OnDeserialization da minha classe pai, para que eu possa enumerá-lo naquele momento?

public virtual void OnDeserialization(object sender)
{
    hashtable.OnDeserialization(sender);
}
Foi útil?

Solução

Esta é realmente uma questão interessante. Depois de verificar o código de serialização com refletor, eu acho que não há geralmente bom soluiton se uma classe que se refere usa IDeserializationCallback.

Provavelmente você já viu, que há duas outras maneiras também para executar algum código durante a desserialização, o [OnDeserializing] eo [OnDeserialized] atributos. Unfortuanately ambas as corridas antes do IDeserializationCallback.OnDeserialization (). Esta é a ordem de execução dos métodos se você tem class1 que se refere a um class2:

Class1: [OnDeserializing]
Class2: [OnDeserializing]
Class2: [OnDeserialized]
Class1: [OnDeserialized]
Class1: IDeserializationCallback.OnDeserialization
Class2: IDeserializationCallback.OnDeserialization

Como você pode ver, o [OnDeserializing] eo [OnDeserialized] atributos trabalho consistente, mas os métodos IDeserializationCallback não realmente ...: (

Eu também ter verificado a implementação OnDeserialization de Hashtable e dicionário, e ambos parece ser seguro para chamar o OnDeserialization mais de uma vez (apenas a primeira chamada irá executar a operação necessária, as chamadas subsequentes não fará nada).

Então, finalmente, você deve chamar o OnDeserialization () do Hashtable, como Sean e Brian sugeriu.

Outras dicas

Eu suspeito que você já pesquisei, mas aconteceu de eu em toda a este padrão ontem.

public BoringClass(SerializationInfo info, StreamingContext context)
{
    Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));
    hashtable.OnDeserialization(this);

    Console.WriteLine("Value is: " + hashtable["testItem"]);

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top