#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?