Web服务无法序列化接口

我有这样的界面:

public interface IDocument : ISerializable { Boolean HasBeenUploaded { get; set; } void ISerializable.GetObjectData(SerializationInfo, StreamingContext) { } } 

有三个文件inheritance自此,所有这些文件序列化都很好。 但是当创建一个简单的Web服务时,它什么都不做,可以将它们上传到…

 public class DCService : System.Web.Services.WebService { [WebMethod] public Boolean ReceiveDocument(IDocument document) { DBIO io = new DBIO(); return io.InsertIntoDB(document); // does nothing; just returns true } } 

我试图运行它时得到这个:“无法序列化接口IDocument”

我不太清楚为什么这会是一个问题。 我知道有些人遇到了麻烦,因为他们不想强制子类来实现自定义序列化,但我确实如此,到目前为止它已经成功了。

编辑>如果我创建接受实现接口的对象的单个web方法,它工作正常,但这削弱了客户端/服务器之间的合同(并破坏了首先拥有接口的目的)

您可能需要对Web方法使用XmlInclude属性。 可以在这里找到一个例子。 我们之前遇到过这个问题,并且已经将XmlInclude属性添加到客户端上的Web服务代理类和某些Web服务方法。

 [WebMethod] [XmlInclude(typeof(MyDocument))] public Boolean ReceiveDocument(IDocument document) { DBIO io = new DBIO(); return io.InsertIntoDB(document); // does nothing; just returns true } 

Asp.net必须能够告诉它在调用该方法时将实例化哪个特定类。 这就是为什么它在使用特定类定义多个方法时的工作原理,即调用将告诉您使用哪个类。

考虑您是否希望客户端为任何文档发送相同的信息集,或者您是否真的需要能够为不同的文档发送不同的信息。 使用后者,您需要客户端知道实现IDocument的类,并使用XmlInclude(作为firedfly发布)执行此操作。

如果您想要始终发送相同的信息而不是现在关于特定的类,请定义具有该信息的类,这是您在方法中收到的内容。 如果您确实需要在其余服务代码中使用IDocument,请在服务中使用适当的逻辑,使用收到的数据获取IDocument实例。

对于firedfly +1,但是应该注意,XmlInclude属性可以附加到Web服务而不是每个方法(或基类型,也是一个选项)。 我测试了它,代码生成得很好,保留了inheritance结构。

我从他提到的同一博客的评论部分得到了这个,所以归功于OP。

BTW这不是对firflypost的评论,因为我没有足够的声誉来发表评论