CommunicationException:尝试序列化参数时出错

时间:2011-07-29 12:02:00

标签: wcf web-services serialization datacontractserializer datacontract

我有一个webservice,其方法是将抽象基类型Specification<TDomainModel>的参数作为参数。我意识到WCF不知道如何在不指定已知类型的情况下对其进行去序列化。但是当我尝试指定它们时,我仍然会遇到这个异常:

  

尝试序列化参数http://myproject.org:specification时出错。 InnerException消息是'Type'MyProject.DomainModel.WebSnapshot.WebSnapshotSpecification',数据协定名称为'WebSnapshotSpecification:http://schemas.datacontract.org/2004/07/MyProject.DomainModel.WebSnapshot'不是预期的。将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

如果有人能看到我错过的地方,我将非常感激:) 这些类看起来如下:

WebSnapshotRepositoryService

[ServiceContract(Namespace = "http://myproject.org")]
[ServiceKnownType(typeof(Specification<WebSnapshot>))]
[ServiceKnownType(typeof(WebSnapshotSpecification))]
public class WebSnapshotRepositoryService
{
    [OperationContract]
    public IEnumerable<WebSnapshot> Get(Specification<WebSnapshot> specification)
    {
        // Code here.
    }
}

WebSnapshotSpecification

public class WebSnapshotSpecification : Specification<WebSnapshot>
{
    public override Expression<Func<WebSnapshot, bool>> IsSatisfiedByExpression()
    {
        return (t) => true;
    }
}

这是WebSnapshot

的规范
[DataContract(IsReference = true, Name = "WebSnapshot", Namespace = "MyProject.DomainModel.WebSnapshot")]
public class WebSnapshot
{
    [DataMember(Order = 1)]
    public virtual string Name { get; set; }
    [DataMember(Order = 2)]
    public virtual string PictureFilePath { get; set; }
    [DataMember(Order = 3)]
    public virtual int PictureHeight { get; set; }
    [DataMember(Order = 4)]
    public virtual int PictureWidth { get; set; }
}

最后,这里是Specification<TDomainModel>

public abstract class Specification<TDomainModel>
{
    public virtual bool IsSatisfiedBy(TDomainModel domainObject)
    {
        return IsSatisfiedByExpression().Compile().Invoke(domainObject);
    }

    public virtual TDomainModel AssembleObject()
    {
        return Activator.CreateInstance<TDomainModel>();
    }

    public abstract Expression<Func<TDomainModel, bool>> IsSatisfiedByExpression();
}

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试将WebSnapshotSpecification类实例发送到服务,并期望WCF序列化/反序列化它包含的IsSatisfiedByExpression 方法。 WCF不支持该方案。如果WebSnapshotSpecification类具有某些属性,那么这些属性将被序列化/反序列化,但方法永远不会是WCF隐式或显式DataContract定义的一部分。