1

我在 Web 服务调用中使用抽象类作为参数。目前,我在基类中包含派生类的 XmlInclude,如下所示:

[XmlInclude(typeof(DerivedClass))]
public abstract class BaseClass
{
}

但是,我宁愿不在基类中包含所有派生类型。

http://www.pluralsight.com/community/blogs/craig/archive/2004/07/08/1580.aspx中,作者提到了另一种选择——将属性写在 web 方法之上,如下所示:

[WebMethod]
[System.Xml.Serialization.XmlInclude(typeof(DerivedClass))]
public BaseClass getClass() {
     return new DerivedClass(); 
}

但是,我也不想将派生类型放入 Web 服务中。有没有办法将属性保留在派生类型中?

4

2 回答 2

4

假设框架需要知道反序列化发生时类型层次结构中的类型,以及这些类型如何在 xml 中表示。如果它存储在派生类型中,它确实无法推断此信息。

然后您有几个选项: - 使用 XmlInclude 属性 - 在 XmlSerializer 构造函数重载中指定允许的类型集

现在,如果您希望将子类传递给 Web 服务,则 Web 服务器控制序列化和反序列化。所以 XmlSerializer 构造函数不再是一个选项。

正如您所说,您可以将属性放在 webservice 方法上,而不是直接放在类上。在保持你的类“纯粹”和记住将这些属性放在它们可能需要的每个地方之间需要权衡取舍。

当然,真正的问题似乎是您正试图将业务对象用作 Web 服务层中的消息格式。

如果您真的想将“消息格式”和“业务对象”职责分开,那么拥有另一个类(具有完整的层次结构),其唯一用途是用作 Web 服务参数。在这种情况下,将您需要的所有 XmlInclude 属性粘贴到基类上是没有问题的。然后,在调用 Web 服务时,将您的业务对象与消息格式对象相适应。这为您提供了额外的好处,即不对参数类型应用 web 服务类型约束(例如,没有接口作为参数)。

当然,这种方法不太方便。

最后,Web 服务需要知道预期的类型,否则将无法正确序列化和反序列化它们。

是的,这是对为什么答案是否定的冗长解释,您不能只将属性保留在派生类型中。不过我很想错:)

于 2009-06-13T07:22:26.060 回答
2

我不明白在这种情况下如何。如果您正在反序列化,则指定额外类型数组的重载会在其中传递派生类型。

于 2009-06-12T20:22:33.587 回答