【问题标题】:How to make code contracts work with deserialization of data contracts?如何使代码合约与数据合约的反序列化一起工作?
【发布时间】:2011-08-07 11:07:18
【问题描述】:

我已经为数据契约类编写了ContractInvariantMethod,并且在客户端一切正常,但是当这种类型的对象被发送到我的服务时,数据契约反序列化器尝试反序列化它,代码契约检查妨碍并抛出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);
 }
}

【问题讨论】:

  • 您能向我们展示您的代码示例吗?它可能会有所帮助。
  • 我更改了问题以包含代码。

标签: .net wcf datacontract code-contracts


【解决方案1】:

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

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

所以用这个:

public DataContractClass()
{
    SetDefaults();
}

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

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

【讨论】:

  • 是的,没错,但有没有办法让它发挥作用?就像在反序列化对象时和设置任何属性之前强制构造函数运行?
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2019-04-17
  • 2022-01-03
  • 2012-10-27
相关资源
最近更新 更多