反序列化会发生什么?

时间:2020-03-06 14:30:44  来源:igfitidea点击:

我目前正在转换我的ASP.NET v2应用程序以序列化/反序列化其对象,因为我想从进程内会话状态转换为状态服务器。这是因为我的主机webhost4life具有讨厌的趋势,需要频繁回收工作进程,从而导致会话超时。反正...问题...

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

私有RollbackQueue作为新队列(DataServer.Rollback的)

在反序列化时,RollbackQueue是a)什么都不是或者b)空队列吗?我的猜测是,.NET反序列化时,它将正常创建父对象,然后一一填写。因此,将触发NEW位。

但这是一个猜测。

谢谢,罗伯。

解决方案

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

为什么不编写一个简单的测试应用程序以找出答案?这是我写的(对不起,VB是Cinstead,但目前有VS2008的CExpress版本打开)。

[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。肯特(Kent)在另一篇文章中已经解释了为什么会这样,以及我们可以采取的措施,因此我将不再赘述。