Почему XmlSerializer Deserialize вызывает мой конструктор класса дважды? - PullRequest
1 голос
/ 23 апреля 2011

Я использую этот код:

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 ]

3 голосов
/ 23 апреля 2011

Имеет ли класс Project открытое свойство, которое выставляет поле _DataBase для сериализатора?

XmlSerializer создаст экземпляр нового объекта DataBaseManager и полностью десериализует его, прежде чем снова присвоить его объекту Project (через открытое свойство).

0 голосов
/ 23 апреля 2011

Если вы выставили DataBaseManager через публичное свойство, то XmlSerializer создаст и десериализует его, как сказал Сэм.Теперь, когда DataBaseManager создается впервые, он, очевидно, выполняется в конструкторе BasicProject.Когда сериализатор пытается десериализовать класс проекта, он вызывает конструктор по умолчанию, который, очевидно, создает менеджер базы данных.

0 голосов
/ 23 апреля 2011

Похоже, что конструктор для типа Project создает экземпляр DataBaseManager.

В вашем случае конструктор Project создает один экземпляр DataBaseManager при десериализации экземпляра типа Project.Затем десериализатор создает другой экземпляр DataBaseManager, который десериализует одно из полей проекта.

...