Java Web Service的C#客户端-数据互操作性问题

Bhaskar:

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

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

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

我对此Web服务有一个C#客户端(在Visual Studio中,通过添加服务引用并指向wsdl url生成)。当我在C#中收到keyList对象时,第一部分(整数键)显示为0。如果我将Java自定义类型更改为在KeyList类型中使用int键(而不是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中的Integer可以为null,这就是您看到的原因minOccurs="0"int不能为null,这就是缺少minOccurs的原因。在C#中,int(或相同的Int32)不能为null,因此不期望minOccurs="0"该问题最有可能在Visual Studio代理生成器中出现。

它应该产生可为空的在C#INT(Int32?int?Nullable<Int32>)该元素:

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

根据生成此代理的方式,Visual Studio可能添加了名为“ keySpecified”的附加布尔字段。有时会在可空字段的名称后添加“ Specified”后缀。它期望您编写如下代码:

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

如果尚未生成“ keySpecified”,则可以查看使用svcutil生成代理它具有比Visual Studio中公开的更多的选择。为您提供的另一种可能的解决方案是仅在Java端坚持使用int,因为它直接在C#端映射为int。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章