【问题标题】:Deserialization NullReferenceException Object Reference With Classes Within Classes类中类的反序列化 NullReferenceException 对象引用
【发布时间】:2014-02-13 22:03:24
【问题描述】:

我的 TypeA 类:

   [Serializable]
   public class TypeA
   {
     public string m_Title { get; set; }

     [XmlIgnore]
     public TypeB m_Target {get; set;}

     public Int32 m_TypeBTargetID
     {
         get { return m_Target.m_ID; }
         set
         {  //the ID is passed to a function that returns
            //a specific TypeB that is in a list in the main thread
             m_Target = FindTypeB(value);
             m_TypeBTargetID= value;
         }
     }

我的主要:

   public ObservableCollection<TypeA> A_Collection { get; set; }
    public void DeSerializeTypeACollection()
    {
        try
        {
            XmlSerializer reader = new XmlSerializer(typeof(ObservableCollection<TypeA>));
            System.IO.TextReader file = new System.IO.StreamReader(
                @"c:\temp\myXML.xml");
            var d = reader.Deserialize(file);
            A_Collection = (ObservableCollection<TypeA>)d;
            file.Close();
        }
        catch { }
    }

用集合中的一个元素序列化的结果,因此我想要序列化:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfTypeA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <TypeA>
   <m_Title>test2</m_Title>
   <m_TypeBTargetID>32770</m_TypeBTargetID>
  </TypeA>
</ArrayOfTypeA>

我遇到的错误发生在 var d = reader.Deserialize(file); 异常表示 XML 文档中存在错误(3,2),即

 <TypeA>

即使有 20 多个元素,它也始终是第一个元素的开始。

内部异常说 NullReferenceException 对象引用未设置为对象的实例。

TypeA 没有被清楚地正确实例化。关于原因,我有 2 个理论。

我在 TypeA 中还有其他私有变量,但一切都在构造函数中实例化。我在某处读到反序列化不会调用构造函数,因此任何需要初始化的东西都需要在其他地方初始化。虽然我不确定。

或者:

对于 TypeB,TypeB 不能从 TypeA 中初始化。它需要调用 FindTypeB(id) 函数,TypeB 在非常特定的时刻在程序的其他地方组成(这发生在我反序列化之前,所以我不相信这是问题所在)。我认为通过将它放在 m_TypeBTargetID 的集合下,它会解决这个问题,因为它会被反序列化。也许那是我的问题而不是私有变量?

编辑:

堆栈跟踪-

+       $exception  {System.InvalidOperationException: There is an error in XML document (3, 4). ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Application.TypeA.Shutdown() in TypeA.cs:line 150
   at Application.TypeA.set_m_Enabled(Boolean value) in TypeA.cs:line 53
   at Application.TypeA..ctor() in TypeA.cs:line 68
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderObservableCollection1.Read3_TypeA(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderObservableCollection1.Read4_ArrayOfTypeA()
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)
   at Application.MainWindow.DeSerializeAlerts() in MainWindow.xaml.cs:line 393}    System.Exception {System.InvalidOperationException}

【问题讨论】:

  • 您能分享一下堆栈跟踪吗?特别是 InnerException。如果存在“内部异常”,则意味着当序列化程序位于第一个“TypeA”元素的末尾并且它刚刚被传递时,其他地方发生了一些事情。
  • 你能展示你所有的TypeA类,尤其是m_Enabled属性吗?
  • 就是这样。谢谢,我意识到我创建了一个特定的 set 属性,它会调用 Shutdown(),它只适用于 m_Enabled 为 false 的情况。在这种情况下,m_Enabled 默认为 false,因为这就是它的默认值。在我的无变量构造函数中,我将它初始化为 true,所以现在当反序列化器设置它时它不会 Shutdown()。我想给你信用,所以如果你愿意,只需更新你的答案 JleruOHeP。 Idk 可能类似于“从设置 m_Enabled 中查看您的 Shutdown()”:P

标签: c# .net xml serialization deserialization


【解决方案1】:

m_TypeBTargetID 的二传手很奇怪。好像你忘记了你的私有变量......试试这个:

[Serializable]
public class TypeA
{
  public string m_Title { get; set; }

  private TypeB _targetB
  [XmlIgnore]
  public TypeB m_Target 
  {
     get //Do you need that setter?
     {
        if (_targetB == null)
            _targetB = FindTypeB(m_TypeBTargetID);

        return _targetB;
     }
  }

  public Int32 m_TypeBTargetID {get; set;}
}

【讨论】:

  • 嗯。您的设置看起来更干净,但它仍然抛出相同的异常。我在 TypeBTargetID 下使用了 setter,认为当它反序列化时,它会尝试设置 ID,然后我希望它弹出 FindTypeB。
  • JleruOHeP 指出我有另一个变量 m_Enabled,它有自己的设置函数,如 Shutdown(),只有在 false 时才会调用,并且从不考虑反序列化器将其设置为默认 false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多