我目前正在将我的ASP.NET v2应用程序转换为序列化/反序列化它的对象,因为我想从inproc会话状态转换到stateserver。这是因为我的主机webhost4life有一种令人讨厌的倾向,即经常回收工作进程,从而导致会话超时。无论如何......问题......
我正在尝试不序列化我不需要的东西,即每页重新初始化的变量,不需要序列化。这是其中之一:
Private RollbackQueue As New Queue(Of DataServer.Rollback)
在反序列化时,RollbackQueue是a)没有或b)空队列?我的猜测是,当.NET反序列化时,它会正常创建父对象,然后逐个填充字段。因此,NEW位将触发。
但这是猜测。
谢谢,Rob。
答案 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。肯特已经在另一篇文章中解释为什么就是这种情况,以及你可以做些什么,所以我不会重新陈述它。