Я управляю большим проектом и нуждаюсь в сериализации и отправке объекта в формате xml. Объект ~ 130 мб.C# serialization xmlwriter stringwriter из памяти для большого объектаhelp
(ПРИМЕЧАНИЕ. Я не писал этот проект, поэтому редактирование вне этого метода или радикальное изменение архитектуры не является вариантом. Оно работает нормально, но когда объект является таким большим, он выдает из памяти . исключение мне нужно сделать, это еще один способ для обработки больших объектов)
текущий код заключается в следующем:.
public static string Serialize(object obj)
{
string returnValue = null;
if (null != obj)
{
System.Runtime.Serialization.DataContractSerializer formatter = new System.Runtime.Serialization.DataContractSerializer(obj.GetType());
XDocument document = new XDocument();
System.IO.StringWriter writer = new System.IO.StringWriter();
System.Xml.XmlTextWriter xmlWriter = new XmlTextWriter(writer);
formatter.WriteObject(xmlWriter, obj);
xmlWriter.Close();
returnValue = writer.ToString();
}
return returnValue;
}
Он бросает аут исключения памяти прямо на ReturnValue = writer.ToString().
я переписал его использовать «используя» блоки, которые я предпочитаю:
public static string Serialize(object obj)
{
string returnValue = null;
if (null != obj)
{
System.Runtime.Serialization.DataContractSerializer formatter = new System.Runtime.Serialization.DataContractSerializer(obj.GetType());
using (System.IO.StringWriter writer = new System.IO.StringWriter())
{
using (System.Xml.XmlTextWriter xmlWriter = new XmlTextWriter(writer))
{
formatter.WriteObject(xmlWriter, obj);
returnValue = writer.ToString();
}
}
}
return returnValue;
}
исследование это, кажется, метод ToString на StringWriter фактически использует двойную оперативную память. (На самом деле у меня много свободного места в памяти, более 4 ГБ, поэтому я не уверен, почему я получаю ошибку из памяти).
Является ли приложение построено для 'x86', 'x64' или 'Any CPU'. Если платформа сборки x86, то ваше .net-приложение работает как 32-битный процесс, хотя у вас есть 64-битная среда и вы можете получить доступ к большему количеству памяти, если она будет работать как x64. –
Это x86, и я не могу это изменить. Но все же, это 130 мега объектов, поэтому в любом случае он не выходит за пределы памяти x86. –
На 32 бит практический предел того, сколько * смежной * памяти вы можете выделить, намного меньше теоретического предела 2 ГБ. Например, http://stackoverflow.com/questions/2415434/the-limitation-on-the-size-of-net-array/2415472#2415472. Какие изменения вы можете внести в этот код? Вам нужно вернуть строку? Может быть, это что-то еще? – dbc