相关疑难解决方法(0)

有没有理由为什么用XmlInclude修饰的基类在序列化时仍会抛出类型未知异常?

我将简化代码以节省空间,但所呈现的内容确实说明了核心问题.

我有一个类,它有一个基类型的属性.有3个派生类可以分配给该属性.

如果我将任何派生类分配给容器并尝试序列化容器,则XmlSerializer会抛出可怕的:

"不期望类型x.使用XmlInclude或SoapInclude属性指定静态未知的类型."

但是我的基类已经用该属性修饰,所以我认为必须有一个额外的"隐藏"要求.

真正奇怪的是,默认的WCF序列化程序对此类层次结构没有任何问题.

Container类

[DataContract]
[XmlRoot(ElementName = "TRANSACTION", Namespace = Constants.Namespace)]
public class PaymentSummaryRequest : CommandRequest
{
    [DataMember]
    public PaymentSummary Summary { get; set; }

    public PaymentSummaryRequest()
    {
        Mechanism = CommandMechanism.PaymentSummary;
    }
}
Run Code Online (Sandbox Code Playgroud)

基类

[DataContract]
[XmlInclude(typeof(xPaymentSummary))]
[XmlInclude(typeof(yPaymentSummary))]
[XmlInclude(typeof(zPaymentSummary))]
[KnownType(typeof(xPaymentSummary))]
[KnownType(typeof(yPaymentSummary))]
[KnownType(typeof(zPaymentSummary))]
public abstract class PaymentSummary
{     
}
Run Code Online (Sandbox Code Playgroud)

派生类之一

[DataContract]
public class xPaymentSummary : PaymentSummary
{
}
Run Code Online (Sandbox Code Playgroud)

序列化代码

var serializer = new XmlSerializer(typeof(PaymentSummaryRequest));
serializer.Serialize(Console.Out,new PaymentSummaryRequest{Summary = new xPaymentSummary{}});
Run Code Online (Sandbox Code Playgroud)

例外

System.InvalidOperationException:生成XML文档时出错.---> System.InvalidOperationException:不期望类型为xPaymentSummary.使用XmlInclude或SoapInclude属性指定静态未知的类型.在

Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentSummaryRequest.Write13_PaymentSummary(String n,String ns,PaymentSummary o,Boolean isNullable,Boolean needType)at at …

.net c# xml-serialization

42
推荐指数
1
解决办法
5万
查看次数

标签 统计

.net ×1

c# ×1

xml-serialization ×1