gpt4 book ai didi

Android ksoap2 可空类型

转载 作者:搜寻专家 更新时间:2023-11-01 09:08:36 24 4
gpt4 key购买 nike

我正在尝试使用 Ksoap2 库从 Android 设备连接到 WCF .Net Web 服务。一切正常,到目前为止,我已经能够发送和接收复杂的对象(经过大量故障排除)。但是,我现在遇到了可空类型的问题。在服务器端,我将发送的许多属性都可以为空。当我尝试从 Android 端将它们作为 null 发送时,我收到反序列化错误,因为 ksoap 将 null=true 而不是 nil=true。这是来自测试驱动程序的一些工作 SOAP XML 以及来自 Android 客户端的当前 XML。

工作测试驱动程序 XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<AddNullables xmlns="http://TJIsGhey/Tester">
<NumbersToAdd xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Input1>7</Input1>
<Input2 i:nil="true" />
</NumbersToAdd>
</AddNullables>
</s:Body>
</s:Envelope>

Android 客户端 XML

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
<AddNullables xmlns="http://TJIsGhey/Tester" id="o0" c:root="1">
<NumbersToAdd i:type="n0:NullablesIn" xmlns:n0="http://TJIsGhey/Tester">
<Input1 i:type="d:int">6</Input1>
<Input2 i:null="true" />
</NumbersToAdd>
</AddNullables>
</v:Body>
</v:Envelope>

这是我收到的错误消息:

反序列化 Tester.NullablesIn 类型的对象时出错。值“”无法解析为类型“Int32”。

如有任何帮助,我们将不胜感激!

最佳答案

我遇到了同样的问题。在深入了解 Ksoap2 源代码后,我发现了这个问题。您有 2 种可能的解决方案,第一个也是简单的解决方案是在 SoapSerializationEnvelope 中使用 VER12。因为 Ksoap2 从 VER12 开始只使用 nil 属性。但是您可能会受到此更改的影响,因此您有另一个选择:继承SoapSerializationEnvelope,重写该类的writeProperty方法。这样:

public class ExtendedSoapSerializationEnvelope extends
SoapSerializationEnvelope {

public ExtendedSoapSerializationEnvelope(int version) {
super(version);
}

@Override
protected void writeProperty(XmlSerializer writer, Object obj,
PropertyInfo type) throws IOException {
if (obj == null) {

if (!(obj instanceof SoapObject)) {
// assuming object implements KvmSerializable or other type of
// Serialization interface
writer.attribute(xsi, version >= VER11 ? "nil" : "null", "true");

} else {
// assuming SoapObject being used with VER12 and up
writer.attribute(xsi, version >= VER12 ? "nil" : "null", "true");
}
return;
}
super.writeProperty(writer, obj, type);
}}

如果您知道您的 webService 总是与 nil 一起工作,您可以完全跳过此检查并只使用:

    @Override
protected void writeProperty(XmlSerializer writer, Object obj,
PropertyInfo type) throws IOException {
if (obj == null) {
writer.attribute(xsi, "nil", "true");
return;
}

super.writeProperty(writer, obj, type);

}

关于Android ksoap2 可空类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10014164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com