Member 14576893 Ответов: 2

Как десериализовать XML C#


Я сериализовал свой объект для записи в файл:

public void writeConfig()
{
	StreamWriter write = new StreamWriter(@"C:\users\public\documents\_myConfig.xml");
	XmlSerializer serialObject = new XmlSerializer(typeof(myObject));

	serialObject.Serialize(write, this);
	write.Close();

}


Это прекрасно работает. Затем я использую десериализацию для чтения файла:

public void readConfig()
{
	StreamReader read = new StreamReader(@"C:\users\public\documents\_myConfig.xml");
	XmlSerializer serialObject = new XmlSerializer(typeof(myObject));
	SurveyConfig deSerialObject = (myObject)serialObject.Deserialize(read);
	read.Close();

}


Что я уже пробовал:

Я не думаю, что делаю это правильно, потому что мне нужно сделать глубокую копию, чтобы получить члены deSerialObject в myObject. Похоже, это противоречит цели. Что я упускаю? Я использую одноэлементный экземпляр своего объекта...

Maciej Los

Вы должны показать нам, как вы объявили myObject...
Это очень важно!

2 Ответов

Рейтинг:
2

Ashutosh Gpt

сериализуйте таким образом и это работает

var xmlSerializer = new XmlSerializer(typeof(myObject));
           using (var xmlStream = new MemoryStream())
           {
               xmlSerializer.Serialize(xmlStream, root);
               xmlStream.Position = 0;
               var xmlDoc = new XmlDocument();
               xmlDoc.Load(xmlStream);
               xmlDoc.Save(@"C:\users\public\documents\_myConfig.xml");
           }


using(StreamReader read = new StreamReader(@"C:\users\public\documents\_myConfig.xml"))
{
	myObject deSerialObject = (myObject)serialObject.Deserialize(read);
}


Рейтинг:
19

RickZeeland

Может быть, вы можете попробовать двоичную сериализацию, см. ответ здесь: c# - в чем разница между XmlSerializer и BinaryFormatter - переполнение стека[^]

Как вы можете видеть на диаграмме, в разделе двоичный форматер упоминается "(глубокая сериализация)".


Member 14576893

Спасибо. Я посмотрел на мелкую и глубокую копию. Это очень простой объект с несколькими полями для настройки при запуске приложения. Создание неглубокой копии объекта, похоже, пока работает.

RickZeeland

Забыл упомянуть, что в обычных классах POCO поля не будут сериализованы, вы должны использовать свойства. Но вы, кажется, уже решили эту проблему :)