3

我有一个 WCF 服务,其运营合同为

void AddQuery(IQuery Query);

我的 IQuery 是这样的

public interface IQuery
{
    Guid                Id { get; set; }        
    string              QueryNo { get; set; }
    string              Status { get; set; }
    IData               data { get; set; }
}

IQuery 的实现在

[Serializable]
public class Query : IQuery
{
    Guid                Id { get; set; }        
    string              QueryNo { get; set; }
    string              Status { get; set; }
    IData               data { get; set; }
}

当我试图从客户端发送我的对象时

  public void AddQuery(IQuery query)
  {
      try
      {
          // I am sure that the query object is not null and it is implemented
          objServiceClient.AddEnquiry(query);
      }
      catch (Exception ex)
      {
      }
  }

但我得到了一个例外

尝试序列化参数时出错。InnerException 消息是 'Type 'ViewModels.Query' ,数据合同名称为 'Query: http://schemas.datacontract.org/2004/07/ViewModels ' 不是预期的。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。有关更多详细信息,请参阅 InnerException。

谁能建议我解决此错误的方法是什么?

4

1 回答 1

5

考虑序列化具体类。您不能序列化接口。参考这个答案:https ://stackoverflow.com/a/4659289/860243

我从 bing 中找到了一些有用的链接:

http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/

上面的文章讨论了您的情况和使用[KnownType]派生类的示例

更新:

基于此链接,请检查以下更新:

public interface IQuery 
{ 
    Guid Id { get; set; }
    string QueryNo{ get; set; } 
    string Status { get; set; } 
    IData data {get; set;}
}

您的 Query 类使用 Data contract 序列化器实现您的接口IQuery

[DataContract]
public class Query : IQuery
{
    [DataMember]
    public Guid Id { get; set; };
    [DataMember]
    public string QueryNo { get; set; };
    [DataMember]
    public string Status { get; set; };
    [DataMember]
    public Data data { get; set; }; //Make sure you serialize Data class as well
}

对于您的服务合同:

[ServiceContract]
public interface IMyQueryService
{
      [OperationContract]
      [ServiceKnownType(typeof(Query))]
      void AddQuery(IQuery query);
}

[ServiceKnownType(typeof(Query))]将使您的操作合同允许Query作为输入。另请注意,您需要指定所有IQuery需要作为参数传递给具有ServiceKnownType属性的操作合同的实现。

此外,如果您希望多个(或所有)操作合同将它们作为参数,请分别指定ServiceKnownType属性ServiceContract而不是每个操作合同。

希望这可以帮助!

于 2013-02-04T16:21:54.293 回答