反序列化会发生什么?

时间:2008-09-21 18:30:59

标签: .net serialization

我目前正在将我的ASP.NET v2应用程序转换为序列化/反序列化它的对象,因为我想从inproc会话状态转换到stateserver。这是因为我的主机webhost4life有一种令人讨厌的倾向,即经常回收工作进程,从而导致会话超时。无论如何......问题......

我正在尝试不序列化我不需要的东西,即每页重新初始化的变量,不需要序列化。这是其中之一:

Private RollbackQueue As New Queue(Of DataServer.Rollback)

在反序列化时,RollbackQueue是a)没有或b)空队列?我的猜测是,当.NET反序列化时,它会正常创建父对象,然后逐个填充字段。因此,NEW位将触发。

但这是猜测。

谢谢,Rob。

2 个答案:

答案 0 :(得分:3)

没什么。 CLR序列化逻辑将通过FormatterServices.GetSafeUnitializedObject创建未初始化的对象,而不运行任何构造逻辑。如果您需要确保该字段具有值,我建议将此类初始化移动到Initialize()方法中,该方法既可以从构造函数调用,也可以从标有OnDeserialized属性的方法调用。

答案 1 :(得分:0)

为什么不写一个简单的测试应用程序来查找?这是我写的一个(原谅C#而不是VB,但我现在打开了VS2008的C#Express版本。)

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

此输出是

Original is null? False 
Copy is null? True

现在您肯定知道,反序列化时它将为null。肯特已经在另一篇文章中解释为什么就是这种情况,以及你可以做些什么,所以我不会重新陈述它。

相关问题