【发布时间】:2011-06-04 17:29:43
【问题描述】:
我将简化代码以节省空间,但所呈现的内容确实说明了核心问题。
我有一个类,它的属性是基类型。有 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, 字符串 ns, PaymentSummary o, Boolean isNullable, Boolean needType) 在
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentSummaryRequest.Write14_PaymentSummaryRequest(字符串 n, 字符串 ns, PaymentSummaryRequest o, Boolean isNullable, Boolean needType) 在
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentSummaryRequest.Write15_TRANSACTION(对象 o) --- 内部异常堆栈结束 跟踪---在
System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, 对象 o, XmlSerializerNamespaces 命名空间, String encodingStyle, String id) at
System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, 对象 o, XmlSerializerNamespaces 命名空间)
在 UserQuery.RunUserAuthoredQuery() 中 c:\Users\Tedford\AppData\Local\Temp\uqacncyo.0.cs:line 47
【问题讨论】:
-
为什么要将 DataContract 与 XML Serializer 混合使用?
-
另外,请显示您用于序列化的代码,并发布包含所有内部异常的完整异常。只需捕获异常并发布 ex.ToString()。
-
他们真的有两个不同的目的。该类本质上是用于与 WCF 服务对话的 DTO。该服务本身正在序列化该 DTO 并将其存储以用于报告和故障排除目的。我将 WCF 特定属性保留在适当的位置,以防两者之间发生一些令人毛骨悚然的动作。
标签: c# .net xml-serialization