Есть ли причина, по которой базовый класс, декорированный XmlInclude, по-прежнему генерирует исключение типа unknown при сериализации?

Я упрощу код для экономии места, но то, что представлено, действительно иллюстрирует основную проблему.

У меня есть класс, у которого есть свойство, являющееся базовым типом. Этому свойству можно присвоить 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 (String n, String ns, PaymentSummary o, Логическое isNullable, логическое needType) в

Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentSummaryRequest.Write14_PaymentSummaryRequest (String n, строка ns, PaymentSummaryRequest o, Логическое isNullable, логическое needType) в

Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentSummaryRequest.Write15_TRANSACTION (Object o) --- Конец внутреннего стека исключений трассировка --- в

System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Объект o, XmlSerializerNamespaces пространства имен, String encodingStyle, String id) в

System.Xml.Serialization.XmlSerializer.Serialize (TextWriter textWriter, Объект o, XmlSerializerNamespaces пространства имен)
в UserQuery.RunUserAuthoredQuery () в c: \ Users \ Tedford \ AppData \ Local \ Temp \ uqacncyo.0.cs: строка 47

42
задан Gustavo Mori 15 July 2015 в 16:03
поделиться