2011-08-15 28 views
9

我的Java Web服務,以及一個參數一個Web方法是一個自定義的Java類型C#的客戶端 - 數據互操作性問題

public class KeyList { 
public Integer key; 
public Integer[] nums ; 
public Integer result; 
} 

Web服務更新的結果值,並返回鍵列表對象給客戶。

我有一個C#客戶端到此Web服務(通過添加服務引用並指向wsdl url在Visual Studio中生成)。當我收到C#中的keyList對象時,第一部分(整數鍵)出來爲0. 如果我改變Java自定義類型在KeyList類型中使用int鍵(而不是Integer鍵),那麼它對於C#客戶端。

我想看看如果WSDL是兩種情況(使用int和整數)之間的顯着差異,但事實證明,唯一的區別是的minOccurs屬性。

使用時使用整數鍵

<xs:element name="key" type="xs:int" minOccurs="0" /> 

當INT關鍵

<xs:element name="key" type="xs:int" /> 

什麼是C#的客戶端無法正常接收到更新的整數從服務的返回值的原因是什麼?毋庸置疑,無論哪種方式,它都適用於Java客戶端。


編輯:由VS爲密鑰列表生成 C#類:

公共類密鑰列表:INotifyPropertyChanged的{

private int keyField; 
private bool keyFieldSpecified; 

private int?[] numsField; 
private PropertyChangedEventHandler PropertyChanged; 
private int resultField; 
private bool resultFieldSpecified; 

public event PropertyChangedEventHandler PropertyChanged; 

public keyList(); 
protected void RaisePropertyChanged(string propertyName); 

[XmlElement(Form=XmlSchemaForm.Unqualified, Order=0)] 
public int key { get; set; } 
[XmlElement("nums", Form=XmlSchemaForm.Unqualified, IsNullable=true, Order=1)] 
public int?[] nums { get; set; } 
[XmlElement(Form=XmlSchemaForm.Unqualified, Order=2)] 
public int result { get; set; } 
[XmlIgnore] 
public bool resultSpecified { get; set; } 

}

+0

這真的是一個C#的問題,而不是一個Java - 你的問題主要涉及到C#客戶端的行爲,而不是Java的行爲。重新標記。 – skaffman

+0

你可以發佈視覺工作室爲你生成的類嗎? – alun

+0

此外,這是用「添加服務參考」還是「添加Web參考」完成的? –

回答

7

整數 java中可以爲空即你爲什麼看到minOccurs="0"int不能爲null,這就是爲什麼minOccurs缺失。在C#中int(或Int32是相同的)不能爲null,因此它不指望minOccurs="0"。該問題很可能在Visual Studio代理生成器中。

應該在C#(Int32?int?Nullable<Int32>)這個元素已經產生nullable INT:所謂

<xs:element name="key" type="xs:int" minOccurs="0" /> 

取決於你如何生成這個代理,Visual Studio中可能會增加額外的布爾場 'keySpecified' 。它有時會將「指定」後綴添加到可空字段的名稱。它希望你寫這樣的代碼:

if(res.keySpecified){ 
    // use res.Key 
} else { 
    // assume res.Key is null 
} 

如果「keySpecified」尚未產生,你可以看看與svcutil產生代理。它比Visual Studio中公開的選項多得多。另一個可能的解決方案是在java端插入int,因爲它直接映射到C#端的int。

+0

指定keySpecified = true爲key從服務返回正確的值。謝謝! – Bhaskar

+0

你是德米特里的男人。這個問題陷入了2天。最後能夠解決它。 – rajibdotnet