2011-08-15 7 views
9

私は、Java Webサービス、および1つのWebメソッドのパラメータを持っているが、カスタムJava型C#クライアント - データの相互運用性の問題

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

Webサービスが結果値を更新し、キーリストオブジェクトを返します。クライアントに送信します。

私はこのWebサービスに対してC#クライアントを持っています(Service Referenceを追加し、wsdl urlを指し示すことでVisual Studioで生成されます)。 C#でkeyListオブジェクトを受け取ると、最初の部分(整数キー)が0になります。 KeyListタイプでintキー(Integer Keyではなく)を使用するJavaカスタムタイプを変更すると、 C#クライアント。

wsdlが2つのケース(intとIntegerを使用)で大幅に異なるかどうかを確認したいのですが、違いはminOccurs属性だけです。

使用している場合

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

キー整数を使用するときにint型のキー

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

正しくサービスからの戻り値で更新整数を受けていないC#クライアントのための原因は何ですか

?言うまでもなく、どちらの方法でもJavaクライアントで正常に動作します。


編集:キー・リストのためのVSによって生成 C#クラス:

パブリッククラスキーリスト:Javaで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

これは実際にはJavaの問題ではなく、C#の質問です。あなたの質問は、主にJavaの問題ではなく、C#クライアントの動作に関係しています。タグを付ける。 – skaffman

+0

ビジュアルスタジオがあなたのために生成したクラスを投稿できますか? – alun

+0

また、これは「サービス参照の追加」または「Web参照の追加」を使用して行われましたか? –

答えて

7

整数がnullつまりすることができなぜ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' と呼ばれる追加のブールフィールドを追加している場合があります。 null可能フィールドの名前に "Specified"接尾辞を追加することがあります。 「keySpecifiedは」あなたがsvcutilでプロキシを生成する時に見ることができます生成されていない場合は

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

:それはあなたがこのようなコードを書くことを期待しています。 Visual Studioに公開されているものよりもはるかに多くの選択肢があります。もう一つの可能​​な解決策は、C#側のintに直接マップするので、java側にintを付けることです。

+0

keySpecified = trueを指定すると、正しい値が返されました。 – Bhaskar

+0

あなたはドミトリーの男です。この問題は2日間続きました。最後にそれを解決することができました。 – rajibdotnet