У меня есть следующий метод для сохранения объекта в файл:
// 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 как строку (а не сохранил ее в файл). Я смотрю в это, но я еще не понял это.
Я подумал, что это может быть действительно легко для тех, кто знаком с этими объектами. Если нет, то я это выясню в конце концов.
источник
typeof(T)
противtoSerialize.GetType()
, пожалуйста, сделайте это, но не в моем ответе. Спасибо.Я знаю, что это не совсем ответ на вопрос, но, основываясь на количестве голосов за вопрос и принятом ответе, я подозреваю, что люди фактически используют код для сериализации объекта в строку.
Использование сериализации XML добавляет ненужный дополнительный текстовый мусор к выводу.
Для следующего класса
это генерирует
Лучшее решение - использовать сериализацию JSON (одним из лучших является Json.NET ). Для сериализации объекта:
Для десериализации объекта:
Сериализованная строка JSON будет выглядеть так:
источник
Сериализация и десериализация (XML / JSON):
источник
Кодекс безопасности Примечание
Что касается принятого ответа , важно использовать
toSerialize.GetType()
вместоtypeof(T)
вXmlSerializer
конструкторе: если вы используете первый код охватывает все возможные сценарии, при использовании последней не удается иногда.Вот ссылка с некоторым примером кода, который мотивирует этот оператор, с
XmlSerializer
выдачей исключения, когдаtypeof(T)
он используется, потому что вы передаете экземпляр производного типа методу, который вызывает методSerializeObject<T>()
, определенный в базовом классе производного типа: http: // ideone .com / 1Z5J1 . Обратите внимание, что Ideone использует Mono для выполнения кода: фактическое исключение, которое вы получите, используя среду выполнения Microsoft .NET, имеет сообщение, отличное от того, которое показано на Ideone, но оно терпит неудачу.Ради полноты я опубликую здесь полный пример кода для дальнейшего использования, на случай, если Ideone (где я разместил код) станет недоступен в будущем:
источник
using (StringWriter textWriter = new StringWriter() {}
для правильного закрытия / утилизации объекта.using
утверждение - лучший друг и для нас, и для наших дорогихIDisposable
реализующих объектов;)Мой 2р ...
источник
источник
Мне не удалось использовать метод JSONConvert, предложенный xhafan
В .Net 4.5 даже после добавления ссылки на сборку «System.Web.Extensions» я все еще не мог получить доступ к JSONConvert.
Однако, как только вы добавите ссылку, вы можете распечатать ту же строку, используя:
источник
Я чувствовал, что мне нужно было поделиться этим манипулированным кодом с принятым ответом - поскольку у меня нет репутации, я не могу комментировать ..
источник
В некоторых редких случаях вы можете захотеть реализовать свою собственную сериализацию String.
Но это, вероятно, плохая идея, если вы не знаете, что делаете. (например, сериализация для ввода / вывода с пакетным файлом)
Нечто подобное могло бы помочь (и это было бы легко отредактировать вручную / пакетно), но будьте осторожны, чтобы сделать еще несколько проверок, так как это имя не содержит перевода строки.
источник
[VB]
[C #]
источник