2

我目前正在转换我的 ASP.NET v2 应用程序来序列化/反序列化它的对象,因为我想从 inproc 会话状态转移到 stateserver。这是因为我的主机 webhost4life 有一种讨厌的倾向,即频繁地回收工作进程,从而导致会话超时。反正……这个问题……

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

私有回滚队列作为新队列(DataServer.Rollback)

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

但这是一个猜测。

谢谢,罗伯。

4

2 回答 2

3

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

于 2008-09-21T18:32:12.403 回答
0

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

[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

现在您肯定知道,反序列化时它将为空。Kent 已经在另一篇文章中解释了为什么会这样,以及你可以做些什么,所以我不会重复它。

于 2008-09-21T18:47:16.687 回答