C# 无法序列化wcf服务中的空整数字段

C# 无法序列化wcf服务中的空整数字段,c#,.net,wcf,serialization,C#,.net,Wcf,Serialization,尝试将数据从我的服务序列化到客户端时,我的WCF服务中出现以下错误。我知道错误发生的原因,但不知道如何解决 异常类型:CommunicationException-服务或客户端应用程序中的通信错误 错误:格式化程序在尝试反序列化消息时引发异常:尝试反序列化参数时出错。InnerException消息是'ValueType'System。Int32'不能为null'。有关更多详细信息,请参阅InnerException 我需要序列化一个空整数属性。它在我的服务上是可以为null的,并且处理得很好,

尝试将数据从我的服务序列化到客户端时,我的WCF服务中出现以下错误。我知道错误发生的原因,但不知道如何解决

异常类型:CommunicationException-服务或客户端应用程序中的通信错误
错误:格式化程序在尝试反序列化消息时引发异常:尝试反序列化参数时出错。InnerException消息是'ValueType'System。Int32'不能为null'。有关更多详细信息,请参阅InnerException

我需要序列化一个空整数属性。它在我的服务上是可以为null的,并且处理得很好,但是当我查看客户端上生成的代理时,它不是可以为null的

[System.Runtime.Serialization.DataMemberAttribute()]
public int VehicleOdometer {
    get { return this.VehicleOdometerField; }
    set { 
           if ((this.VehicleOdometerField.Equals(value) != true)) {
              this.VehicleOdometerField = value;
              this.RaisePropertyChanged("VehicleOdometer");
           }
        }
}
将我的wcf服务引用配置为可空时,如何在客户端上获取属性?

这是我在服务器端的财产

private int? vehicleOdometer;

[DataMember(Name = "VehicleOdometer")]
public int? VehicleOdometer
{
   get { return vehicleOdometer; }
   set { vehicleOdometer = value; }
}
这是在我的客户机上生成的属性。注意它是如何不可为空的

[System.Runtime.Serialization.DataMemberAttribute()]
public int VehicleOdometer {
    get { return this.VehicleOdometerField; }
    set { 
           if ((this.VehicleOdometerField.Equals(value) != true)) {
              this.VehicleOdometerField = value;
              this.RaisePropertyChanged("VehicleOdometer");
           }
        }
}

以下是技巧

private int vehicleOdometer;
private int? vehicleOdometerExposed;

public int VehicleOdometer
    {
        get { if (vehicleOdometerExposed != null) return (int)vehicleOdometerExposed; else return -1; }
        set { vehicleOdometer = value; vehicleOdometerExposed = value; }
    }
[DataMember(Name = "VehicleOdometer")]
public int? VehicleOdometerExposed
    {
        get { return vehicleOdometerExposed; }
        set { vehicleOdometerExposed = value; }
    }
  • 向外部世界展示车辆里程表,并将其命名为车辆里程表
  • 使用物业车辆里程表进行维修侧编码
  • 看看这两个属性,VehicleOdometer不是datamember,但它从VehicleOdometerExposed获取数据,VehicleOdometerExposed是datamember
  • 如果客户未接触车辆里程表,服务端的车辆里程表属性将为您提供-1(您可以将其更改为-9999或您选择的任何其他数字)
  • A-1会告诉你客户没有发送任何东西
  • 这是我认为可以用DataContractSerializer实现nullables的唯一方法

    希望这会有帮助


    我需要做的是完全删除我的服务引用,清理我的解决方案,然后再次重新添加我的服务引用。。。这一次,可以为空的字段只是使用了我原来的技术sagesky36 2014年3月28日


    这句话为我解决了问题。删除了引用,清理了我的解决方案,重建了服务(在我执行此操作之前出现错误),并重新添加了引用,所有操作都正常进行。

    这可能是因为该属性最初为int并且已更改为null int吗?您可以尝试重建WCF服务并重新生成代理,以查看是否修复了它。更新
    服务参考
    您是否尝试在数据成员上设置
    IsRequired=false
    ?例如,[DataMember(IsRequired=false)]`?DeanOC/Silvermind,我用新的可为null的整数重建了代理/服务引用,但仍然没有显示在代理中。Tim,我将IsRequired=false放在那里,重建了我的服务,将我的客户端重新配置为更新服务引用,但仍然不能为null…我需要做的是完全删除我的服务引用,清理我的解决方案,然后再次重新添加我的服务引用。。。这一次,可空字段只是使用我原来的技术。@ SaSkyK36。如果你用这种方式解决了你的问题,请考虑把它作为答案并接受它。