【发布时间】: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