2014-09-03 4 views
0

Есть ли альтернативный способ выполнения операции:Эффективное использование TextWriter

textWriter.Write(myBigObject.ToString())

такие, что:

  • myBigObject является «струящийся» в текстовое представление, не создавая весь объект строки в памяти
  • Нет дополнительных классов или предметов, кроме myBigObject и textWriter

Пример: представьте, что myBigObject имеет 50 строковых полей. Нет смысла присоединяться ко всем этим полям в большой строке, а затем записывать объект в файл, если есть возможность записать строки один за другим в файл.

+0

Вы пытаетесь записать строку или двоичное представление объекта? Потому что у вас не может быть строки без создания пространства для нее в памяти, если вы не делаете что-то фантастическое. – Codeman

+3

'ToString' полностью инкапсулирует свой способ создания строки, и нет метода' object', который передает строковое представление. Без более подробной информации это «нет». – zneak

+0

«нет дополнительных классов или объектов», а «myBigObject' имеет 50 строковых полей», противоречат друг другу. Что он? –

ответ

0

Учитывая ограничения, которые вы наметили, это невозможно. Вам придется придумать способ прочитать данные из вашего объекта и записать его на char/byte/line за раз.

Если вы хотите, чтобы иметь возможность перебирать ваши свойства и записывать их по одному, тогда это можно было бы использовать с помощью reflection. Однако я подозреваю, что переход на этот маршрут приведет к использованию большего объема памяти, чем ваше исходное решение, а также значительно сложнее простого вызова .ToString().

+0

Я хочу написать свои данные по одному полю за раз, конечно, без замены одного вызова метода со многими вызовами, по одному на поле. –

2

Если у вас есть доступ к коду, то вы можете добавить метод в MyBigObject, который принимает TextWriter и записывает каждое свойство. Например:

public class MyBigObject 
{ 
    public void Write(TextWriter writer) 
    { 
     writer.Write(bigStringField1); 
     writer.Write(bigStringField2); 
     // etc. 
    } 
} 

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

Если вы не являетесь владельцем кода, и поля открываются через свойства, вы можете создать класс адаптера, который принимает MyBigObject и выписывает каждое свойство. Вы также можете создать некоторые методы расширения, которые делают то же самое.

Если вы не можете получить доступ к исходному коду, вы можете использовать отражение, чтобы исследовать поля на объекте, захватить значение каждого поля и Write() из представления ToString() каждого значения. Тем не менее, отражение происходит медленнее, чем прямой доступ к полям, и он включает в себя гораздо более промежуточные объекты. Я не знаю, будет ли использование рефлексии стоить этого в вашем случае.

+0

Это звучит прекрасно, но у меня все еще есть проблема с этим. Если я это сделаю, мой код будет выглядеть так: 'writer.WriteLine (« вот мой большой объект: »); myBigObject.Write (автор); '. Как вы можете видеть, API будет отменен, и это выглядит не очень хорошо. Есть ли обходной путь для этого? –

Смежные вопросы