Сериализация XML и как она обрабатывает запись в файл

#asp.net #xml #vb.net #xml-serialization

#asp.net #xml #vb.net #xml-сериализация

Вопрос:

Я искал повсюду и не смог найти решение своей проблемы.

У меня типичная ситуация, когда процесс постепенно съедает память. В конечном итоге процесс выдает исключение OutOfMemory. Эта проблема решалась в прошлом простым созданием специальной машины с большим объемом памяти.

Этот процесс загружает только один из наших клиентов, у которого около 450 000 записей. Мы перебираем коллекцию учетных записей и создаем объект класса, который затем передается в xml-сериализатор. Этот объект имеет несколько свойств и методов, которые не все будут заполнены одновременно. Эти объекты заполняются на основе информации в каждой записи учетной записи.

Я проверил способ, которым мы вызываем конструктор для XML-сериализатора, и он находится в формате, который сохранял бы xml-сборку, а не создавал новые каждый раз. Итак, я не верю, что произошла утечка памяти из-за создания динамических сборок.

Как мы вызываем сериализатор: Dim k1Serializer Как новый XmlSerializer(GetType(ClassObject))

Мои вопросы:

При сериализации большого объекта сериализатор просматривает все возможные сериализуемые объекты или только те, которые заполнены вашим объектом?

Может ли сериализация этого объекта большого класса вызывать проблему?

Я заметил, что когда мы передаем сериализованный объект, он не записывается автоматически в указанный файл. Я думаю, требуется несколько секунд, чтобы сериализовать объект, а затем записать его. Может ли тот факт, что мы перебираем так много записей, так быстро, что у сериализатора недостаточно времени для записи в файл, а затем освобождения памяти?

Я действительно в своем уме, и буду признателен за любую помощь. Пожалуйста, дайте мне знать, если потребуется какая-либо другая информация.

Спасибо

Комментарии:

1. можете ли вы показать более актуальный код, иллюстрирующий, как вы вызываете сериализатор, и во что вы превращаете сериализацию.

Ответ №1:

Одновременная загрузка 450 000 записей в память только для записи в XML-файл не кажется мне хорошей идеей. Я бы посоветовал вам перепроектировать функциональность, используя XmlWriter вместо XML Serializer, таким образом, весь набор информации не нужно хранить в памяти одновременно.

Комментарии:

1. Мы загружаем 450 000 записей в массив объектов, а затем перебираем эти объекты, заполняя их необходимыми данными, а затем передаем каждый объект в XML-сериализатор. Извините, если я не прояснил это в первом сообщении.

Ответ №2:

Рассмотрите возможность изучения XmlTextWriter. Вы можете вручную записать XML-данные для своих данных, не прибегая к черному ящику, который является XmlSerializer.

Простой пример для перебора списка элементов и записи их в XML-файл:

 var settings = new System.Xml.XmlWriterSettings
{
    OmitXmlDeclaration = true,
    Indent= true
};    
string myXmlNamespace = "urn:myXmlNamespace";
using (var fileStream = 
    new FileStream("MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None))
{
  using (XmlWriter w = XmlWriter.Create(fileStream, settings)) 
  {
    w.WriteStartElement("root", myXmlNamespace);
    for (var elt in myCollection) 
    {
      w.WriteStartElement("elt",myXmlNamespace);
      w.WriteElementString("prop1",myXmlNamespace,elt.Property1); 
      w.WriteElementString("prop2",myXmlNamespace,elt.Property2);
      w.WriteEndElement();
    }
  }
}
  

Вам пришлось бы сделать обратное для «десериализации». Откройте filestream, затем используйте XmlTextReader () для чтения XML и создания экземпляров элементов для добавления в вашу коллекцию.

Комментарии:

1. -1 нет, используй XmlWriter.Create . XmlTextWriter устарел начиная с .NET 2.0.

2. а, ладно, хорошее замечание. Теперь я это вспомнил. В свою защиту скажу, что страница doc для XmlTextWriter по-прежнему показывает примеры использования конструктора.

3. Мы используем XmlWriter для передачи в XML-сериализатор. Мы используем сериализатор, потому что нам приходится заполнять множество объектов, и я чувствую, что переписывание всего процесса для использования XmlWriter на данный момент не было бы отличным решением. Мы планируем немного переписать наш процесс позже в будущем. Является ли использование XML-сериализатора плохим выбором для начала. Используя сериализатор, мне не нужно беспокоиться о том, чтобы каждый раз записывать startelement, endelement и т.д.

4. ps, Джон, твой отрицательный отзыв из-за меньшей точки в коде примера кажется довольно резким.

5. чтобы ответить на ваш вопрос «является ли использование XmlSerializer плохим выбором для начала?» — возможно . Имея 450 000 записей, я бы, вероятно, сначала обратился к реальной базе данных, а не к формату XML. Мой ответ выше, предложение использовать XmlWriter напрямую, основан на предположении, что вы привязаны к формату XML. В таком случае я предлагаю вам использовать API более низкого уровня для самостоятельной записи XML, чтобы, возможно, избежать состояния нехватки памяти. Просто любопытно — как вы создаете XmlWriter, который вы используете сейчас ? Поддерживается ли она FileStream?