Уверен, что stringWriter уже очень большой, допустим, размер более 1 Гб и что ваш компьютер имеет общую память 2 ГБ. Когда вы вызываете ToString(), память будет удваиваться, потому что новая строка будет создана и распределена в куче размером 1 ГБ, чтобы иметь возможность скопировать содержимое stringWriter. Попытайтесь избежать ненужного ToString() и попытайтесь сделать то, что вам нужно, используя напрямую stringWriter. Избегая ToString(), вы обычно уменьшаете объем памяти на 50%.
Но если вам действительно нужны ваши данные в виде строки, и у вас недостаточно памяти, попробуйте сначала сохранить содержимое в файле, удалите StringWriter и загрузите содержимое файла в строку с помощью StreamReader.ReadToEnd() API.
Еще один пример - попытаться разрезать нечеткие сериализованные данные и попытаться разобрать их в кусках. Например, давайте рассмотрим XML, который имеет структуру, подобную этой:
<Root>
<Item>some data 1</Item>
<Item>some data 2</Item>
<Item>some data 3</Item>
....
<Item>some data n</Item>
</Root>
Вы можете сериализовать объект в MemoryStream, а затем прочитать его на куски и создавать «маленькие» XML-данные из ваших куски, которые выглядят так:
Первый XML:
<Root>
<Item> some data 1 </Item>
</Root>
Второй XML:
<Root>
<Item> some data 2 </Item>
</Root>
И и так далее, которые могут быть проверены индивидуально и проверены.
У меня есть подозрение, вы можете иметь [циклическую ссылку] (http://stackoverflow.com/a/5004495/314291) в ваш сериализованный график. Возможно, вам придется переключиться на DataContractSerializer. – StuartLC
Размер объекта огромный .. как его оптимизировать – vmb
Если есть круговая ссылка, более вероятно, что будет выведено исключение StackOverflowException. –