【问题标题】:web service can't serialize an interfaceWeb 服务无法序列化接口
【发布时间】:2010-10-14 03:05:07
【问题描述】:

我有一个这样的界面:

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

从这里继承了三个文档,所有这些文档都可以很好地序列化。但是当创建一个简单的 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”

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

edit> 如果我创建单独的 Web 方法来接受实现接口的对象,它可以正常工作,但这会削弱客户端/服务器之间的契约(并首先破坏拥有接口的目的)

【问题讨论】:

  • 您好,只是想知道您最终解决了这个问题。我有一个类似的问题,我需要通过 web 服务返回一个接口对象的数组。
  • 我做了很多事情:我最终使用了一个具体的类而不是一个接口,这很有效,但是从那里我切换到了 WCF 服务。最终,该项目的整个部分因“更紧迫的事情”而被“搁置”(无限期地阅读)
  • 我试图强制序列化在 asmx web 服务中工作,包括 webmethod 签名中的接口,但即使所有必要的 XmlInclude 属性都到位,也无法让它工作。我的结论是,它要么无法完成,要么非常困难,没人会打扰。

标签: c# web-services serialization interface


【解决方案1】:

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

[WebMethod]
[XmlInclude(typeof(MyDocument))]
public Boolean ReceiveDocument(IDocument document)
{
    DBIO io = new DBIO();

    return io.InsertIntoDB(document); // does nothing; just returns true
}

【讨论】:

  • 我可以有多个包含,例如 [XmlInclude(typeof(DocType1))] [XmlInclude(typeod(DocType2))] - 无论如何我都会尝试,但对于下一位读者...
  • 不幸的是,这似乎只适用于基本类型,而不适用于接口:(
  • @SnOrfus - 你可以有多个 XmlInclude 属性。我不知道接口不适用于 XmlInclude。我们自己从未尝试过。
  • @SnOrfus 你的意思是包含的类型是接口吗?正如我在回答中所说,您必须在某个时候指向具体的类,否则 asp.net 将无法判断使用哪个类
【解决方案2】:

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

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

如果您希望始终发送相同的信息,而不是现在发送有关特定类的信息,请使用该信息定义一个类,这就是您在方法中收到的信息。如果您确实需要在服务代码的其余部分中使用 IDocument,请在服务中使用适当的逻辑,使用接收到的数据为您获取 IDocument 实例。

【讨论】:

    【解决方案3】:

    +1 用于firefly,但是应该注意 XmlInclude 属性可以附加到 Web 服务 class 而不是每个方法(或基类型,这也是一个选项) .我已经测试过了,代码生成的很好,保持了继承结构。

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

    顺便说一句,这不是对 firefly 帖子的评论,因为我没有足够的声誉来评论

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      相关资源
      最近更新 更多