Java Web服务的c#客户端-数据互操作性问题

本文关键字:数据 互操作性 问题 客户端 Web 服务 Java | 更新日期: 2023-09-27 18:05:33

我有一个Java Web服务,一个Web方法的参数是一个自定义Java类型

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

Web服务更新Result值并将KeyList对象返回给客户端。

我有一个c#客户端到这个Web服务(在Visual Studio中通过添加服务引用和指向wsdl url生成)。当我在c#中接收keyList对象时,第一部分(整数键)输出为0。如果我将Java自定义类型更改为在KeyList类型中使用int key(而不是Integer key),那么它可以很好地用于c#客户端。

我想看看wsdl在两种情况下是否有很大的不同(使用int和Integer),但事实证明唯一的区别是minOccurs属性。

当使用整数键 时

<xs:element name="key" type="xs:int" minOccurs="0" /> 
当使用int键

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

c#客户端没有正确接收到服务返回值中更新后的Integer的原因是什么?不用说,它可以很好地用于Java客户端。


编辑:VS为KeyList生成的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; }

}

Java Web服务的c#客户端-数据互操作性问题

Integer在java中可以为null,这就是为什么您看到minOccurs="0"int不能为空,这就是minOccurs缺失的原因。在c#中,int(或Int32)不能为空,因此它不期望minOccurs="0"。这个问题很可能出现在Visual Studio代理生成器中。

它应该在c#中为这个元素生成可空的int (Int32?int?Nullable<Int32>):

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

根据你如何生成这个代理,Visual Studio可能已经添加了额外的bool字段'keySpecified'。它有时会在可空字段的名称后添加"指定"后缀。它希望您编写这样的代码:

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

如果'keySpecified'尚未生成,您可以查看使用svcutil生成代理。它比Visual Studio提供了更多的选项。另一种可能的解决方案是在java端坚持使用int,因为它直接映射到c#端的int。