2014-03-27 54 views
0

當我嘗試從我的服務序列化數據到客戶端時,在我的WCF服務中出現以下錯誤。我知道爲什麼的錯誤正在發生,但我不知道如何來解決它。無法序列化wcf服務中的空整型字段

ExceptionType: CommunicationException - Communication error in either the service or client application
Error: The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:GetRyderVehiclesResult . The InnerException message was 'ValueType 'System.Int32' cannot be null.'. Please see InnerException for more details.

有一個空的整數屬性,我需要序列化。它可以在我的服務上爲空,並且處理得很好,但是當我查看客戶端上生成的代理時,它是而不是可以爲空。

在配置我的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"); 
      } 
     } 
} 
+1

難道這是因爲該屬性最初是int並且已被更改爲可爲空?您可以嘗試重建您的WCF服務並重新生成代理以查看是否修復它。 – DeanOC

+0

更新'服務參考' – Silvermind

+0

您是否嘗試過在數據成員上設置「IsRequired = false」? I.e.,[DataMember(IsRequired = false)]'? – Tim

回答

1

這裏是絕招

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; } 
    } 
  1. 到外部世界,你會暴露VehicleOdometerExposed一個名字VehicleOdometer。
  2. 使用屬性VehicleOdometer進行服務端編碼。
  3. 看看這兩個屬性,VehicleOdometer不是數據存儲器,而是從VehicleOdometerExposed獲取數據,它是一個數據存儲器。
  4. 如果VehicleOdometerExposed未被客戶保留,您的VehicleOdometer屬性在服務端會給您-1(您可以將其更改爲-9999或您選擇的任何其他數量)。
  5. A -1會告訴你客戶端沒有發送任何東西。

這是我相信可以用DataContractSerializer實現可空數組的唯一方法。

希望它會有所幫助。

+2

我需要做的是完全刪除我的Service Reference,清理我的解決方案,然後再次重新添加我的服務參考...這次可空字段只是使用我的原始技術。 – sagesky36

+1

@ sagesky36如果你以這種方式解決你的問題,請考慮發佈這個答案並接受它。 – rcdmk

0

What I needed to do was to completely delete my Service Reference, clean my solution, and then re-add my service reference back again... This time the nullable fields were there simply using my original technique. – sagesky36 Mar 28 '14

此評論爲我解決了這個問題。刪除引用,清理我的解決方案,重建服務(在我這樣做之前得到一個錯誤),並重新添加引用和所有工作。