Pregunta

Actualmente estoy convirtiendo mi aplicación ASP.NET v2 para serializar/deserializar sus objetos porque quiero pasar del estado de sesión en proceso al servidor de estados.Esto se debe a que mi servidor, webhost4life, tiene una desagradable tendencia a reciclar el proceso de trabajo con frecuencia, lo que provoca tiempos de espera de sesión.De todos modos...la pregunta...

Estoy tratando de no serializar cosas que no necesito, es decir.Las variables que se reinician en cada página no necesitan ser serializadas.Aquí está uno de ellos:

RollbackQueue privada como nueva cola (de DataServer.Rollback)

Al deserializar, ¿RollbackQueue será a) nada ob) una cola vacía?Supongo que cuando .NET se deserializa, crea el objeto principal normalmente y luego completa los campos uno por uno.Por lo tanto, se activará el bit NUEVO.

Pero eso es una suposición.

Gracias, Rob.

¿Fue útil?

Solución

No será nada.La lógica de serialización CLR creará el objeto no inicializado mediante FormatterServices.GetSafeUnitializedObject sin ejecutar ninguna lógica de construcción.Si necesita asegurarse de que el campo tenga un valor, recomendaría mover dicha inicialización a un Initialize() método que se llama tanto desde su constructor como desde un método marcado con el En deserializado atributo.

Otros consejos

¿Por qué no escribir una aplicación de prueba sencilla para descubrirlo?Aquí hay uno que escribí (disculpe C# en lugar de VB, pero tengo abierta la versión C# Express de VS2008 en este 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();
    }
}

El resultado de esto es

Original is null? False 
Copy is null? True

Ahora sabe con certeza que será nulo cuando se deserialice.Kent ya lo ha explicado en otro post por qué Este es el caso y qué puedes hacer al respecto, así que no lo repetiré.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top