.net 如何使代码契约与数据契约的反序列化一起工作?

.net 如何使代码契约与数据契约的反序列化一起工作?,.net,wcf,datacontract,code-contracts,.net,Wcf,Datacontract,Code Contracts,我已经为数据协定类编写了一个ContractVariantMethod,在客户端一切都很好,但是当这种类型的对象被发送到我的服务时,数据协定反序列化器尝试对其进行反序列化,代码协定检查会遇到阻碍并抛出ContractException,他失败了。 原因是在类的(默认)构造函数中,我将属性设置为满足不变量,但显然在反序列化对象时不会调用构造函数。 有解决办法吗 以下是我的数据契约类: [DataContract] public class DataContractClass { public D

我已经为数据协定类编写了一个
ContractVariantMethod
,在客户端一切都很好,但是当这种类型的对象被发送到我的服务时,数据协定反序列化器尝试对其进行反序列化,代码协定检查会遇到阻碍并抛出
ContractException
,他失败了。 原因是在类的(默认)构造函数中,我将属性设置为满足不变量,但显然在反序列化对象时不会调用构造函数。 有解决办法吗

以下是我的数据契约类:

[DataContract]
public class DataContractClass
{
 public DataContractClass()
 {
  this.Field1= this.Field2= -1;
 }
 [DataMember]
 public int Field1 {get; set;}
 [DataMember]
 public int Field2 {get; set;}

 [ContractInvariantMethod]
 private void Invariants()
 {
  Contract.Invariant(this.Field1== -1 || this.Field2== -1);
 }
}

在运行时检查期间,不变量是 在每个公共方法的末尾检查

因此,当序列化程序将Property1和Property2设置为非-1时,您会得到一个契约异常,因为反序列化程序不使用构造函数

所以用这个:

public DataContractClass()
{
    SetDefaults();
}

[OnDeserializing]
private void OnDeserializing(StreamingContext context)
{
    SetDefaults();
}

private void SetDefaults()
{
    Property1 = -1;
    Property2 = -1;
}

你能给我们展示一下你的代码吗?这可能会有帮助。我将问题改为包含代码。是的,没错,但是有办法让它工作吗?比如在反序列化对象时,在设置任何属性之前强制构造函数运行?