我正在使用此代码:
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
创建后调用,所以我认为我没有做错任何事情
答案 0 :(得分:3)
Project
类是否有公共属性会将_DataBase
字段暴露给序列化程序?
XmlSerializer将实例化一个新的DataBaseManager
对象并将其完全反序列化,然后再将其分配回Project
对象(通过公共属性)。
答案 1 :(得分:0)
看起来Project类型的构造函数创建了DataBaseManager的实例。
在您的情况下,Project的构造函数在反序列化Project类型的实例时创建一个DataBaseManager实例。然后,反序列化器创建另一个实例DataBaseManager,它反序列化一个Project字段。
答案 2 :(得分:0)
如果您通过公共属性公开DataBaseManager
,那么XmlSerializer将创建并反序列化它,如Sam所说。现在第一次创建DataBaseManager
时,它显然是在BasicProject
的构造函数中完成的。当序列化程序尝试反序列化项目类时,它会调用默认的构造函数,这显然会创建一个数据库管理器。