【问题标题】:What happens on deserialization with this?反序列化会发生什么?
【发布时间】:2008-09-21 18:30:58
【问题描述】:

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

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

Private RollbackQueue 作为新队列(Of DataServer.Rollback)

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

但这只是猜测。

谢谢,罗伯。

【问题讨论】:

    标签: .net serialization


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      为什么不写一个简单的测试应用程序来找出答案?这是我写的(请原谅我用的是 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 已经在另一篇文章中解释了为什么会出现这种情况,以及你可以做些什么,所以我不会重复它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 2015-06-19
        • 2013-09-20
        • 2012-10-02
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多