Поток памяти пуст - PullRequest
       11

Поток памяти пуст

3 голосов
/ 26 мая 2011

Мне нужно создать огромный XML-файл из разных источников (функций). Я решил использовать XmlTextWriter, поскольку он использует меньше памяти, чем XmlDocument.

Во-первых, инициируйте XmlWriter с базовым MemoryStream

MemoryStream ms = new MemoryStream();
XmlTextWriter xmlWriter = new XmlTextWriter(ms, new UTF8Encoding(false, false));
xmlWriter.Formatting = Formatting.Indented;

Затем я передаю XmlWriter (заметьте, что XML Writer остается открытым до самого конца) функции для генерации начала XML-файла:

xmlWriter.WriteStartDocument();

xmlWriter.WriteStartElement();

// xmlWriter.WriteEndElement(); // Do not write the end of root element in first function, to add more xml elements in following functions

xmlWriter.WriteEndDocument();
xmlWriter.Flush();

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

Кроме того, у меня есть общий вопрос о том, как создать огромный XML-файл из разных источников (функций). Что я делаю сейчас, так это оставляю XmlWriter открытым (я предполагаю, что основной поток памяти должен также открыться) для каждой функции и записи. В первой функции я не пишу конец корневого элемента. После последней функции я вручную добавляю конец корневого элемента следующим образом:

string endRoot = "</Root>";
byte[] byteEndRoot = Encoding.ASCII.GetBytes(endRoot);
ms.Write(byteEndRoot, 0, byteEndRoot.Length); 

Не уверен, работает ли это или нет.

Большое спасибо!

Ответы [ 3 ]

6 голосов
/ 26 мая 2011

Технически, вы должны задавать только один вопрос на каждый вопрос, поэтому я собираюсь ответить только на первый, потому что на данный момент для меня это просто быстрый визит в SO.

Вам нужно позвонить Flush , прежде чем пытаться читать из Stream, я думаю.

Edit Просто запутываю мою вторую догадку из комментариев ниже, чтобы оправдать принятый здесь ответ.

В дополнение к вызову Flush, если чтение из потока выполняется с использованием метода Read и его братьев, тогда позиция в потоке должна сначала быть возвращена к началу.В противном случае никакие байты не будут прочитаны.

ms.Position = 0; /*reset Position to start*/
StreamReader reader = new StreamReader(ms); 
string text = reader.ReadToEnd(); 
Console.WriteLine(text); 
1 голос
/ 26 мая 2011

Убедитесь, что вы вызываете Flush для XmlTextWriter перед проверкой потока памяти.

1 голос
/ 26 мая 2011

Возможно, вам нужно вызвать Flush () в потоке xml, прежде чем проверять память.

...