为什么XmlSerializer的反序列化调用我的类构造函数两次?

时间:2011-04-22 20:33:05

标签: c# .net winforms xmlserializer

我正在使用此代码:

using (Stream stream = File.Open(fileName, FileMode.Open))
{
    XmlSerializer xmlFormatter = new XmlSerializer(typeof(Project));
    result = (Project)xmlFormatter.Deserialize(stream);
}

反序列化我的Project课程。在该类中,还有另一个名为DataBaseManager的类,它以这种方式定义:

private DataBaseManager _DataBase = new DataBaseManager();
每次创建

DataBaseManager实施IDisposable需求。但出于某种原因Deserialize正在创建一个DataBaseManager两次并且没有处置它们中的任何一个(当然其中一个不能被丢弃,因为我将使用它)。

这是第一次调用的调用堆栈:

HS Dll.exe!Player.DataBaseManager.DataBaseManager() Line 42 C#
HS Dll.exe!Player.Project.BasicProject.BasicProject() Line 108 + 0x15 bytes C#
HS Dll.exe!WebScraperAndPlayer.Project.Project() Line 23 + 0x8 bytes    C#
xdowmsmh!Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderProject.Read32_Project(bool isNullable, bool checkType) + 0x178 bytes  
xdowmsmh!Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderProject.Read33_Project() + 0xb8 bytes  
[Native to Managed Transition]  
System.Xml.dll!System.Xml.Serialization.TempAssembly.InvokeReader(System.Xml.Serialization.XmlMapping mapping, System.Xml.XmlReader xmlReader, System.Xml.Serialization.XmlDeserializationEvents events, string encodingStyle) + 0xc1 bytes 
System.Xml.dll!System.Xml.Serialization.XmlSerializer.Deserialize(System.Xml.XmlReader xmlReader, string encodingStyle, System.Xml.Serialization.XmlDeserializationEvents events) + 0xc8 bytes  

这是第二个电话:

HS Dll.exe!Player.DataBaseManager.DataBaseManager() Line 42 C#
xdowmsmh!Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderProject.Read32_Project(bool isNullable, bool checkType) + 0x2a53 bytes 
xdowmsmh!Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderProject.Read33_Project() + 0xb8 bytes  
[Native to Managed Transition]  
System.Xml.dll!System.Xml.Serialization.TempAssembly.InvokeReader(System.Xml.Serialization.XmlMapping mapping, System.Xml.XmlReader xmlReader, System.Xml.Serialization.XmlDeserializationEvents events, string encodingStyle) + 0xc1 bytes 
System.Xml.dll!System.Xml.Serialization.XmlSerializer.Deserialize(System.Xml.XmlReader xmlReader, string encodingStyle, System.Xml.Serialization.XmlDeserializationEvents events) + 0xc8 bytes  

另外,DataBaseManager实现IXmlSerializable,但ReadXml仅在DataBaseManager创建后调用,所以我认为我没有做错任何事情

3 个答案:

答案 0 :(得分:3)

Project类是否有公共属性会将_DataBase字段暴露给序列化程序?

XmlSerializer将实例化一个新的DataBaseManager对象并将其完全反序列化,然后再将其分配回Project对象(通过公共属性)。

答案 1 :(得分:0)

看起来Project类型的构造函数创建了DataBaseManager的实例。

在您的情况下,Project的构造函数在反序列化Project类型的实例时创建一个DataBaseManager实例。然后,反序列化器创建另一个实例DataBaseManager,它反序列化一个Project字段。

答案 2 :(得分:0)

如果您通过公共属性公开DataBaseManager,那么XmlSerializer将创建并反序列化它,如Sam所说。现在第一次创建DataBaseManager时,它显然是在BasicProject的构造函数中完成的。当序列化程序尝试反序列化项目类时,它会调用默认的构造函数,这显然会创建一个数据库管理器。