2008-09-21 63 views
2

我目前convering我的ASP.NET v2应用程序序列化/反序列化的对象,因为我想从进程内会话状态转变为StateServer。这是因为我的主机webhost4life有一个令人讨厌的倾向,即经常回收工作进程,从而导致会话超时。反正...问题...用这个去反序列化会发生什么?

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

私人RollbackQueue作为新队列(中DataServer.Rollback)

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

但是,这是一个猜测。

谢谢,罗布。

回答

3

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

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 

现在你肯定知道,那反序列化时,它会为空。肯特已经在另一篇文章中解释过为什么这是这种情况,你可以做些什么,所以我不会重新说明它。