2011-08-15 3 views
9

내가 자바 웹 서비스, 하나의 웹 메서드에 매개 변수를 사용자 정의 Java 형C#을 클라이언트 - 데이터 상호 운용성 문제

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

웹 서비스가 결과 값을 업데이트하고 키리스트 객체를 반환 클라이언트에게.

이 웹 서비스에 대한 C# 클라이언트가 있습니다 (서비스 참조를 추가하고 wsdl URL을 가리키면 Visual Studio에서 생성됨). C#에서 keyList 객체를 받으면 첫 번째 부분 (Integer 키)이 0으로 나옵니다. KeyList 유형에서 Integer Key가 아닌 int 키를 사용하도록 Java 사용자 정의 유형을 변경하면 C# 클라이언트.

wsdl이 두 경우 (int와 Integer 사용)에서 크게 다른지 확인하고자했지만 minOccurs 속성 만 차이가 있음을 확인했습니다.

사용하는 경우

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

키 정수를 사용하는 경우 INT 키

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

제대로 서비스의 반환 값에 업데이트 된 정수를 수신하지 C#을 클라이언트의 원인은 무엇입니까

? 말할 필요도없이 Java 클라이언트를 사용하면 문제가 없습니다.


편집 : 키리스트에 대한 VS에 의해 생성 C# 클래스 :

공용 클래스하여 keyList :에서 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

Visual Studio에서 생성 한 수업을 게시 할 수 있습니까? – alun

+0

또한 "Add Service Reference"또는 "Add Web Reference"를 사용 했습니까? –

답변

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' . nullable 필드의 이름에 "Specified"접미사를 추가하는 경우가 있습니다. 그것은 당신이 같은 코드를 작성하는 기대 :

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

하면 'keySpecified'당신이 svcutil와 프록시를 생성 볼 수 있습니다 생성되지 않았습니다. Visual Studio에서 노출되는 것보다 훨씬 더 많은 옵션이 있습니다. 또 다른 가능한 해결책은 C# 측에서 int로 직접 매핑되기 때문에 int를 자바 측에 고수하는 것입니다.

+0

keySpecified = true를 지정하면 서비스에서 올바른 값을 반환합니다. 감사합니다. – Bhaskar

+0

당신은 드미트리 사람입니다. 이 문제로 2 일 동안 붙어 있습니다. 마침내 그것을 해결할 수 있습니다. – rajibdotnet