Кодекс безопасности Примечание
Что касается принятого ответа , важно использовать 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();
}
}