Domanda

Attualmente sto convertendo la mia applicazione ASP.NET v2 per serializzare / deserializzare i suoi oggetti perché voglio passare dallo stato della sessione inproc allo server degli stati. Questo perché il mio host, webhost4life, ha una brutta tendenza a riciclare frequentemente il processo di lavoro causando timeout della sessione. Comunque ... la domanda ...

Sto cercando di non serializzare le cose che non mi servono, ovvero le variabili che vengono reinizializzate in ogni pagina, non devono essere serializzate. Eccone uno:

RollbackQueue privato come nuova coda (Of DataServer.Rollback)

In caso di deserializzazione, RollbackQueue sarà a) nulla o b) una coda vuota? La mia ipotesi è che quando .NET si deserializza, crea l'oggetto genitore normalmente e quindi riempie i campi uno per uno. Pertanto, il NUOVO bit verrà attivato.

Ma questa è un'ipotesi.

Grazie, Rob.

È stato utile?

Soluzione

Non sarà nulla. La logica di serializzazione CLR creerà l'oggetto non inizializzato tramite FormatterServices.GetSafeUnitializedObject senza eseguire alcuna logica di costruzione. Se devi assicurarti che il campo abbia un valore, ti consiglio di spostare tale inizializzazione in un metodo Initialize () chiamato sia dal tuo costruttore che da un metodo contrassegnato con attributo OnDeserialized .

Altri suggerimenti

Perché non scrivere una semplice applicazione di prova per scoprirlo? Eccone uno che ho scritto (scusa C # invece di VB, ma al momento ho la versione C # Express di VS2008 aperta al 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();
    }
}

L'output da questo è

Original is null? False 
Copy is null? True

Ora sai per certo che sarà nullo quando sarà deserializzato. Kent ha già spiegato in un altro post perché questo è il caso e cosa puoi fare al riguardo, quindi non lo ribadirò.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top