Я упросту код для экономии места, но то, что представлено, иллюстрирует основную проблему.
У меня есть класс, у которого есть свойство, являющееся базовым типом.Есть 3 производных класса, которые могут быть назначены этому свойству.
Если я назначу какой-либо из производных классов контейнеру и попытаюсь сериализовать контейнер, XmlSerializer выдает ужас:
"Тип x не ожидался. Используйте XmlIncludeили атрибут SoapInclude для указания типов, которые статически не известны. "
Однако мой базовый класс уже украшен этим атрибутом, поэтому я считаю, что должно быть дополнительное «скрытое» требование.
Действительно странная часть заключается в том, что сериализатор WCF по умолчанию не имеетпроблемы с этой иерархией классов.
Класс-контейнер
[DataContract]
[XmlRoot(ElementName = "TRANSACTION", Namespace = Constants.Namespace)]
public class PaymentSummaryRequest : CommandRequest
{
[DataMember]
public PaymentSummary Summary { get; set; }
public PaymentSummaryRequest()
{
Mechanism = CommandMechanism.PaymentSummary;
}
}
Базовый класс
[DataContract]
[XmlInclude(typeof(xPaymentSummary))]
[XmlInclude(typeof(yPaymentSummary))]
[XmlInclude(typeof(zPaymentSummary))]
[KnownType(typeof(xPaymentSummary))]
[KnownType(typeof(yPaymentSummary))]
[KnownType(typeof(zPaymentSummary))]
public abstract class PaymentSummary
{
}
Один из производных классов
[DataContract]
public class xPaymentSummary : PaymentSummary
{
}
Код сериализации
var serializer = new XmlSerializer(typeof(PaymentSummaryRequest));
serializer.Serialize(Console.Out,new PaymentSummaryRequest{Summary = new xPaymentSummary{}});
Исключение
System.InvalidOperationException: при создании XML-документа произошла ошибка.---> System.InvalidOperationException: тип xPaymentSummary не ожидался.Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически.в
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentSummaryRequest.Write13_PaymentSummary (Строка n, Строка ns, PaymentSummary o, логическое значение isNullable, логическое значение needType) в
*..Serialization.GeneratedAssembly.XmlSerializationWriterPaymentSummaryRequest.Write14_PaymentSummaryRequest (Строка n, Строка ns, PaymentSummaryRequest o, логическое значение isNullable, логическое значение needType) в
WareSense_Rechange.Exchange.Exchange.Exchange.Exchange.Exchange_Exchange.Exchange_Exchange_Exchange.Extification.- Конец внутренней трассировки стека исключений --- в
System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Object o, XmlSerializerNamespaces пространства имен, String encodingStyle, String id) в
System.Xml.Serialization.XmlSerializer.Serialize (TextWriter textWriter, Object o, пространства имен XmlSerializerNamespaces)
в UserQuery.RunUserAuthoredQuery () в c: \ Users \ Tedford \ AppData \ Local \ Temp \ uqacncyo.0.cs: строка 47