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.

Foi útil?

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.

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