Ted*_*ord 42 .net c# xml-serialization
我将简化代码以节省空间,但所呈现的内容确实说明了核心问题.
我有一个类,它有一个基类型的属性.有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
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentSummaryRequest.Write14_PaymentSummaryRequest(String n,String ns,PaymentSummaryRequest o,Boolean isNullable,Boolean needType)at at
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentSummaryRequest.Write15_TRANSACTION(对象O)---内部异常堆栈跟踪的末尾在
System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter,Object o,XmlSerializerNamespaces namespaces,String encodingStyle,String id)at
System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter,Object o,XmlSerializerNamespaces名称空间)
位于c:\ Users\Tedford\AppData\Local\Temp\uqacncyo.0.cs中的UserQuery.RunUserAuthoredQuery():第47行
Ran*_*ica 41
您看到的问题是因为PaymentSummaryRequest正在设置命名空间.您可以删除命名空间或向PaymentSummary类添加命名空间:
[XmlRoot(Namespace = Constants.Namespace)]
[XmlInclude(typeof(xxxPaymentSummary))]
public abstract class PaymentSummary
{
}
Run Code Online (Sandbox Code Playgroud)
正如@Tedford在下面的评论中提到的,只有在使用派生类型时才需要命名空间.
在生成XML序列化程序集时,由于Root节点具有名称空间集而基类不存在,因此它不会在生成的序列化程序集中包含XML Include逻辑.
解决该问题的另一种方法是从类本身中删除名称空间声明,并在XmlSerializer构造函数上指定名称空间:
var serializer = new XmlSerializer(
typeof(PaymentSummaryRequest),
Constants.Namespace
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48027 次 |
| 最近记录: |