O que acontece na desserialização com isso?
-
02-07-2019 - |
Pergunta
Atualmente estou convering minha aplicação v2 ASP.NET serializar / desserializar-lo de objetos, porque eu quero mudar de estado da sessão InProc para StateServer. Isso ocorre porque o meu anfitrião, webhost4life, tem uma desagradável tendência para reciclar o processo de trabalho com freqüência, assim, causando tempos limite de sessão. Enfim ... a pergunta ...
Eu estou tentando coisas não serialize Eu não precisam, ou seja, variáveis ??que são re-inicializado cada página, não precisa ser serializado. Aqui está um deles:
Privada RollbackQueue As New Queue (Of DataServer.Rollback)
Em deserialisation, vai RollbackQueue ser a) nada ou b) uma fila vazia? Meu palpite é que quando .NET deserialises, ele cria o objeto pai como normal e, em seguida, preenche os campos, um por um. Portanto, o novo bit dispara.
Mas isso é uma suposição.
Obrigado, Rob.
Solução
Será nada. A lógica CLR serialização irá criar o objeto não inicializado por meio de FormatterServices.GetSafeUnitializedObject sem correr qualquer lógica de construção. Se você precisa garantir que o campo tem um valor Eu recomendaria movendo tais inicialização em um método Initialize()
que é chamado tanto de seu construtor e de um método marcado com o OnDeserialized atributo.
Outras dicas
Por que não escrever um aplicativo de teste simples de descobrir? Aqui está um que eu escrevi (desculpem o C #, em vez de VB, mas eu tenho a versão C # Express de VS2008 aberto no momento).
[Serializable]
class TestClass
{
[NonSerialized]
public Queue<string> queue = new Queue<string>();
}
class Program
{
static void Main(string[] args)
{
var obj = new TestClass();
Console.WriteLine("Original is null? {0}", obj.queue == null);
var stream = new MemoryStream();
var formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
stream.Position = 0L;
var copy = (TestClass)formatter.Deserialize(stream);
Console.WriteLine("Copy is null? {0}", copy.queue == null);
Console.ReadLine();
}
}
A saída deste é
Original is null? False
Copy is null? True
Agora você sabe com certeza, que será nulo quando desserializado. Kent já explicou em outro post por este for o caso, e que você pode fazer sobre ele, por isso não vou re-state-lo.