Код безопасности Примечание
Что касается принятого ответа , важно использовать toSerialize.GetType()
вместо typeof(T)
в XmlSerializer
конструкторе: если вы используете первый, код покрывает все возможные сценарии, при использовании последнего один иногда терпит неудачу.
Вот ссылка с некоторым примером кода, который мотивирует этот оператор, с 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();
}
}