У меня есть следующий метод для сохранения Объекта в файл:
// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
TextWriter textWriter = new StreamWriter(filename);
xmlSerializer.Serialize(textWriter, toSerialize);
textWriter.Close();
}
Я признаюсь, что не записал это (я только преобразовал его в дополнительный метод, который взял параметр типа).
Теперь мне нужен он, чтобы отдать xml мне как строка (а не сохранить его в файл). Я изучаю его, но я еще не понял это.
Я думал, что это могло бы быть действительно легко для кого-то знакомого с этими объектами. Если не я пойму это в конечном счете.
Используйте StringWriter
вместо StreamWriter
:
public static string SerializeObject<T>(this T toSerialize)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
using(StringWriter textWriter = new StringWriter())
{
xmlSerializer.Serialize(textWriter, toSerialize);
return textWriter.ToString();
}
}
Обратите внимание, что важно использовать toSerialize.GetType ()
вместо typeof (T)
в конструкторе XmlSerializer: если вы используете первый, код охватывает все возможные подклассы T
(которые действительны для метод), тогда как использование последнего приведет к ошибке при передаче типа, производного от T
.
Вот ссылка на пример кода, который мотивирует это утверждение, где XmlSerializer
вызывает исключение
, когда typeof (T)
] используется, потому что вы передаете экземпляр производного типа методу, вызывающему SerializeObject, который определен в базовом классе производного типа: http://ideone.com/1Z5J1 .
Кроме того, Ideone использует Mono для выполнения кода; фактическое исключение
, которое вы получите при использовании Microsoft.NET имеет другое сообщение
, отличное от показанного на Ideone, но оно все равно не работает.