如何使代码合同与数据合同的反序列化一起工作?

时间:2011-08-07 11:07:18

标签: .net wcf datacontract code-contracts

我为数据协定类编写了一个ContractInvariantMethod,一切都在客户端很好用,但是当这种类型的对象发送到我的服务,并且Data Contract Deserializer试图反序列化它时,代码合同检查妨碍了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);
 }
}

1 个答案:

答案 0 :(得分:6)

在运行时检查期间,不变量是 在每种公共方法结束时检查。

因此,当Serializer将Property1和Property2设置为-1时,您会收到合同异常,因为反序列化器不使用构造函数。

所以使用这个:

public DataContractClass()
{
    SetDefaults();
}

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

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