Question

Je suis en train de convertir mon application ASP.NET v2 pour sérialiser / désérialiser ses objets, car je souhaite passer de l'état de session inproc à stateServer. Cela est dû au fait que mon hôte, webhost4life, a une fâcheuse tendance à recycler fréquemment le processus de travail, ce qui entraîne des délais d'attente de session. Quoi qu'il en soit ... la question ...

J'essaie de ne pas sérialiser les éléments dont je n'ai pas besoin, à savoir les variables qui sont réinitialisées à chaque page, n'ont pas besoin d'être sérialisés. En voici un:

Private RollbackQueue en tant que nouvelle file d'attente (de DataServer.Rollback)

Lors de la désérialisation, RollbackQueue sera-t-il a) rien ou b) une file d'attente vide? Je suppose que lorsque .NET se désérialise, il crée l'objet parent normalement et remplit les champs un à un. Par conséquent, le bit NEW sera activé.

Mais c'est une supposition.

Merci, Rob.

Était-ce utile?

La solution

Ce ne sera rien. La logique de sérialisation CLR créera l'objet sans initialisation au moyen de FormatterServices.GetSafeUnitializedObject sans exécuter aucune logique de construction. Si vous devez vous assurer que le champ a une valeur, je vous recommande de déplacer cette initialisation dans une méthode Initialize () appelée à la fois par votre constructeur et par une méthode marquée avec le caractère attribut OnDeserialized .

Autres conseils

Pourquoi ne pas écrire une application de test simple à découvrir? En voici un que j’ai écrit (excusez le C # au lieu de VB, mais j’ai la version C # Express de VS2008 ouverte pour le moment).

[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();
    }
}

La sortie de ceci est

Original is null? False 
Copy is null? True

Vous savez maintenant avec certitude qu'il sera nul lors de la désérialisation. Kent a déjà expliqué dans un autre article pourquoi que tel est le cas et ce que vous pouvez faire à ce sujet. Par conséquent, je ne le répète pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top