Web服务 – 派生类中的XmlInclude而不是基类?

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

让我们认为框架在某种程度上需要知道反序列化时类型层次结构中的类型是什么,以及这些类型如何在xml中表示。 如果它存储在派生类型中,它实际上无法推断出这些信息。

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

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

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

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

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

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

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

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

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