2011-08-15 16 views
9

Mam serwis WWW Java i parametr do jednej metody Web jest niestandardowy typ JavaC# klienta do serwisu WWW Java - dane interoperacyjność problem

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

Usługa Web aktualizuje wartość wynik i zwraca obiekt keylist do klienta.

Mam klienta C# do tej usługi sieci Web (generowane w Visual Studio, dodając Service Reference i wskazując adres URL pliku wsdl). Kiedy otrzymuję obiekt keyList w języku C#, pierwsza część (klucz Integer) jest wyświetlana jako 0. Jeśli zmienię typ niestandardowy Java, aby używał klucza int (zamiast klucza Integer) w typie KeyList, to działa on dobrze dla Klient C#.

Chciałem sprawdzić, czy wsdl drastycznie różni się między tymi dwoma przypadkami (używając int i Integer), ale okazuje się, że jedyną różnicą jest atrybut minOccurs.

podczas korzystania Integer kluczową

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

przy użyciu int klucz

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

Co jest przyczyną C# client nieprawidłowo otrzymaniu zaktualizowanej Integer wartości powrotnej z usługi? Nie trzeba dodawać, że tak czy inaczej działa on dla klienta Java.


Edit: C# klasy generowane przez VS dla keylist:

public class 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

To jest naprawdę pytanie w języku C#, a nie Java - twoje pytanie dotyczy przede wszystkim zachowania klienta C#, a nie języka Java. Retagging. – skaffman

+0

Czy możesz opublikować klasę utworzoną dla studia wizualnego? – alun

+0

Czy dokonano tego przy użyciu "Dodaj odniesienie do usługi" lub "Dodaj odniesienie do strony internetowej"? –

Odpowiedz

7

Integer w Javie może być null, że jest dlaczego widzisz minOccurs="0". int nie może być pusty i dlatego brakuje minOccurs. W C# int (lub Int32, który jest taki sam) nie może być pusty, więc nie oczekuje się, że będzie to minOccurs="0". Problem najprawdopodobniej występuje w generatorze proxy programu Visual Studio.

Powinno być generowane nullable int w C# (Int32? lub int? lub Nullable<Int32>) dla tego elementu:

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

zależności od sposobu generowany ten proxy, Visual Studio mogło dodanego dodatkowego pola bool nazwie 'keySpecified' . Czasami dodaje on przyrostek "Określony" do nazwy pola zerowego. Spodziewa się, aby napisać kod tak:

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

Jeśli „keySpecified” nie został wygenerowany można spojrzeć na generowanie proxy z svcutil. Ma o wiele więcej opcji niż to, co jest wyeksponowane w Visual Studio. Innym możliwym rozwiązaniem dla Ciebie jest po prostu trzymać z int po stronie Java, ponieważ mapuje bezpośrednio do int na stronie C#.

+0

, określając keySpecified = true, aby uzyskać poprawne wartości z powrotem z serwisu. Dzięki! – Bhaskar

+0

Jesteś mężczyzną Dmitry. Utknąłem z tym problemem przez 2 dni. Wreszcie w stanie go rozwiązać. – rajibdotnet

Powiązane problemy