Примітка щодо безпеки коду
Стосовно прийнятої відповіді важливо використовувати toSerialize.GetType()
замість typeof(T)
inXmlSerializer
конструкторі: якщо ви використовуєте перший код охоплює всі можливі сценарії, при використанні останньої не вдається іноді.
Ось посилання з деяким прикладом коду, що мотивує це висловлювання, з XmlSerializer
викиданням винятку при typeof(T)
використанні, оскільки ви передаєте екземпляр похідного типу методу, який викликає, SerializeObject<T>()
який визначений у базовому класі похідного типу: http: // ideone .com / 1Z5J1 . Зауважте, що Ideone використовує Mono для виконання коду: фактичне Виняток, яке ви отримаєте за допомогою Microsoft .NET виконання, має інше Повідомлення, ніж те, яке показано на Ideone, але воно не відповідає точно так само.
Для повноти я розміщую тут повний зразок коду для подальшої довідки, про всяк випадок, якщо Ideone (де я розмістив код) у майбутньому стане недоступним:
using System;
using System.Xml.Serialization;
using System.IO;
public class Test
{
public static void Main()
{
Sub subInstance = new Sub();
Console.WriteLine(subInstance.TestMethod());
}
public class Super
{
public string TestMethod() {
return this.SerializeObject();
}
}
public class Sub : Super
{
}
}
public static class TestExt {
public static string SerializeObject<T>(this T toSerialize)
{
Console.WriteLine(typeof(T).Name); // PRINTS: "Super", the base/superclass -- Expected output is "Sub" instead
Console.WriteLine(toSerialize.GetType().Name); // PRINTS: "Sub", the derived/subclass
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
StringWriter textWriter = new StringWriter();
// And now...this will throw and Exception!
// Changing new XmlSerializer(typeof(T)) to new XmlSerializer(subInstance.GetType());
// solves the problem
xmlSerializer.Serialize(textWriter, toSerialize);
return textWriter.ToString();
}
}