Web服务 - XmlInclude在派生类而不是基类中?

时间:2009-06-12 19:56:26

标签: c# web-services xml-serialization abstract-class

我在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服务中。有没有办法将属性保留在派生类型中?

2 个答案:

答案 0 :(得分:4)

让我们把它当作一个给定的框架以某种方式需要知道反序列化时类型层次结构中的类型,以及这些类型如何在xml中表示。如果它存储在派生类型中,它实际上无法推断出这些信息。

然后你有几个选择: - 使用XmlInclude属性 - 在XmlSerializer构造函数重载

中指定允许类型的集合

现在,如果您希望将子类传递给Web服务,则Web服务器将控制序列化和反序列化。因此,XmlSerializer contstructor不再是一个选项。

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

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

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

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

最后,Web服务需要知道期望的类型,或者无法正确地序列化和反序列化。

是的,这是一个冗长的解释,为什么答案是否定的,你不仅可以将属性保留在派生类型中。我喜欢错了:)

答案 1 :(得分:2)

我不知道在这种情况下怎么样。如果要反序列化,则指定额外类型数组会有一个重载,您可以在其中传入派生类型。