2

Ksoap2 ライブラリを使用して、Android デバイスから WCF .Net Web サービスに接続しようとしています。これまでのところ、複雑なオブジェクトを送受信できました (多くのトラブルシューティングの後)。ただし、現在、null 許容型の問題に直面しています。サーバー側では、送信する属性の多くが null 可能になります。これらを Android 側から null として送信しようとすると、ksoap が nil=true ではなく null=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' として解析できません。

どんな助けでも大歓迎です!

4

3 に答える 3

2

同じ問題がありました。Ksoap2 のソース コードを詳しく調べたところ、問題が見つかりました。最初の簡単な解決策は、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);

}
于 2012-12-25T11:35:09.897 に答える
1

回避策は、次のような"<element type>"パラメーターを使用してこれを無視することです。skipNullProperties

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.skipNullProperties=true;
于 2014-03-29T03:54:12.563 に答える