Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将字符串强制转换为ksoap2中的SoapObject?_Android_String_Soap_Casting_Ksoap2 - Fatal编程技术网

Android 如何将字符串强制转换为ksoap2中的SoapObject?

Android 如何将字符串强制转换为ksoap2中的SoapObject?,android,string,soap,casting,ksoap2,Android,String,Soap,Casting,Ksoap2,在我的Android应用程序中,我使用ksoap2与服务器通信。我通过soap请求下载某个复杂的体育信息结构,然后在我的程序中解析它 我想做的是以某种方式“保存”这个复杂的结构,以便以后当该结构中的所有信息都是最终信息且不再更改时,我可以再次解析它,这样我就可以显示它,而无需再次调用web服务 我已经做到了这一点,我可以使用SoapObject类中的toString()方法将整个结构转换成字符串,以便将其保存在应用程序的共享首选项中 但是:要用我的解析器解析字符串,当我直接从web服务器下载数据

在我的Android应用程序中,我使用ksoap2与服务器通信。我通过soap请求下载某个复杂的体育信息结构,然后在我的程序中解析它

我想做的是以某种方式“保存”这个复杂的结构,以便以后当该结构中的所有信息都是最终信息且不再更改时,我可以再次解析它,这样我就可以显示它,而无需再次调用web服务

我已经做到了这一点,我可以使用SoapObject类中的toString()方法将整个结构转换成字符串,以便将其保存在应用程序的共享首选项中

但是:要用我的解析器解析字符串,当我直接从web服务器下载数据时,我需要它作为SoapObject。我试过这样的方法:

SoapObject soapObj = (SoapObject) dataAsStringFromSharedPrefs;

但我不能用这种方式将字符串转换为SoapObject

比如说,someObject是一个具有成员CategoryId、名称和描述的对象。如果要在响应中获取这些对象成员,可以通过执行以下操作将其保存到someObject:

SoapObject response = (SoapObject)envelope.getResponse();

someObject.CategoryId =  Integer.parseInt(response.getProperty(0).toString());
someObject.Name =  response.getProperty(1).toString();
someObject.Description = response.getProperty(2).toString();
编辑:

好的,我现在明白问题了

要获得soapobject,我唯一能想到的方法是:

1) 解析存储的字符串 2) 将所有数据字段存储在局部变量中

Parse stored string:

start loop
int x = something
string y = something
double z = something
end loop
someObject.fieldx = x
someObject.fieldy = y
someObject.fieldz = z
3) 使用变量创建新对象

Parse stored string:

start loop
int x = something
string y = something
double z = something
end loop
someObject.fieldx = x
someObject.fieldy = y
someObject.fieldz = z
4) 创建一个新的soapobject

SoapObject sp_Object = new SoapObject(NAMESPACE, METHOD_NAME);
5) 使用步骤3中的对象创建propertyinfo

PropertyInfo prop = new PropertyInfo();
prop.setNamespace(NAMESPACE);
prop.setType(someObject.getClass());
prop.setValue(someObject);
6) 在步骤4中将propertyinfo添加到soapobject

sp_Object.addProperty(prop);

然后,您可以将soapobject sp_对象用于解析器。

比方说,someObject是一个具有成员CategoryId、名称和描述的对象。如果要在响应中获取这些对象成员,可以通过执行以下操作将其保存到someObject:

SoapObject response = (SoapObject)envelope.getResponse();

someObject.CategoryId =  Integer.parseInt(response.getProperty(0).toString());
someObject.Name =  response.getProperty(1).toString();
someObject.Description = response.getProperty(2).toString();
编辑:

好的,我现在明白问题了

要获得soapobject,我唯一能想到的方法是:

1) 解析存储的字符串 2) 将所有数据字段存储在局部变量中

Parse stored string:

start loop
int x = something
string y = something
double z = something
end loop
someObject.fieldx = x
someObject.fieldy = y
someObject.fieldz = z
3) 使用变量创建新对象

Parse stored string:

start loop
int x = something
string y = something
double z = something
end loop
someObject.fieldx = x
someObject.fieldy = y
someObject.fieldz = z
4) 创建一个新的soapobject

SoapObject sp_Object = new SoapObject(NAMESPACE, METHOD_NAME);
5) 使用步骤3中的对象创建propertyinfo

PropertyInfo prop = new PropertyInfo();
prop.setNamespace(NAMESPACE);
prop.setType(someObject.getClass());
prop.setValue(someObject);
6) 在步骤4中将propertyinfo添加到soapobject

sp_Object.addProperty(prop);

然后,您可以将soapobject sp_对象用于解析器。

这里的操作似乎有效:

public SoapObject createSoapObjectFromSoapObjectString(String soapObjectString)
{
// Create a SoapSerializationEnvelope with some config
SoapSerializationEnvelope env = new SoapSerializationEnvelope(SoapEnvelope.VER11);
env.dotNet = true;

// Set your string as output
env.setOutputSoapObject(soapObjectString);

// Get response
SoapObject so = (SoapObject) env.getResponse();

return so;
}

这似乎是可行的:

public SoapObject createSoapObjectFromSoapObjectString(String soapObjectString)
{
// Create a SoapSerializationEnvelope with some config
SoapSerializationEnvelope env = new SoapSerializationEnvelope(SoapEnvelope.VER11);
env.dotNet = true;

// Set your string as output
env.setOutputSoapObject(soapObjectString);

// Get response
SoapObject so = (SoapObject) env.getResponse();

return so;
}

希望这在将soap XML字符串转换为soap对象时可以正常工作

public SoapObject string2SoapObject(byte[] bytes)
{
    SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER12);
    SoapObject soap=null;
    try {
        ByteArrayInputStream inputStream=new ByteArrayInputStream(bytes);
        XmlPullParser p= Xml.newPullParser();
        p.setInput(inputStream, "UTF8");
        envelope.parse(p);
        soap=(SoapObject)envelope.bodyIn;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return soap;
}

希望这在将soap XML字符串转换为soap对象时可以正常工作

public SoapObject string2SoapObject(byte[] bytes)
{
    SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER12);
    SoapObject soap=null;
    try {
        ByteArrayInputStream inputStream=new ByteArrayInputStream(bytes);
        XmlPullParser p= Xml.newPullParser();
        p.setInput(inputStream, "UTF8");
        envelope.parse(p);
        soap=(SoapObject)envelope.bodyIn;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return soap;
}


谢谢,但是保存部分响应甚至完整响应(f.e.作为字符串)不是问题。问题是从保存的零件重新创建SoapObject。我该如何实现呢?如果您的解析器需要一个soapobject,那么为什么要使用tostring将响应转换为字符串呢?响应是一个soapObject。尝试解析它。SoapObject响应=(SoapObject)信封.getResponse();如果我没有弄错的话,我不能将SoapObject保存到SharedReferences以供以后使用。这就是为什么我通过toString()转换它,以便将其保存在SharedReferences中。我无法测试您的答案是否正确,因为同时我更改为通过SQLiteDatabase存储数据。但是无论如何,谢谢你的努力。谢谢,但是保存部分响应甚至完整响应(f.e.作为字符串)不是问题。问题是从保存的零件重新创建SoapObject。我该如何实现呢?如果您的解析器需要一个soapobject,那么为什么要使用tostring将响应转换为字符串呢?响应是一个soapObject。尝试解析它。SoapObject响应=(SoapObject)信封.getResponse();如果我没有弄错的话,我不能将SoapObject保存到SharedReferences以供以后使用。这就是为什么我通过toString()转换它,以便将其保存在SharedReferences中。我无法测试您的答案是否正确,因为同时我更改为通过SQLiteDatabase存储数据。但是无论如何,谢谢你的努力。你解决了你的问题吗?@NaveedAli我为我的用例找到了另一种方法。我将结果解析为数据模型,将其序列化并保存到共享首选项,而不是将字符串解析/构造为soap对象。稍后加载时,我将其反序列化回我的数据模型。@NaveedAli我刚刚找到了一种从字符串创建SoapObject的方法,并将其作为答案发布。您的问题解决了吗?@NaveedAli我为我的用例找到了另一种方法。我将结果解析为数据模型,将其序列化并保存到共享首选项,而不是将字符串解析/构造为soap对象。当我稍后加载它时,我将它反序列化回我的数据模型。@NaveedAli我刚刚找到一种从字符串创建SoapObject的方法,并将其作为答案发布。我有同样的要求,我尝试了上述解决方案。但它没有起作用。它在第
SoapObject so=(SoapObject)env.getResponse()行抛出异常。我想有些代码丢失了。是的,巴沙胡尔吉。以上代码对我也不起作用。在这方面我能帮上忙吗。。首先AM接收加密的字符串SOAP对象来解密响应,解密后,AM接收响应,将其视为字符串格式XML响应。需要再次转换SOAP对象来处理响应。我不再使用KSOAP2,因为我切换到应用程序中的REST。很抱歉,我无法在此提供帮助。我有相同的要求,我尝试了上述解决方案。但它没有起作用。它在第
SoapObject so=(SoapObject)env.getResponse()行抛出异常。我想有些代码丢失了。是的,巴沙胡尔吉。以上代码对我也不起作用。在这方面我能帮上忙吗。。首先AM接收加密的字符串SOAP对象来解密响应,解密后,AM接收响应,将其视为字符串格式XML响应。需要再次转换SOAP对象来处理响应。我不再使用KSOAP2,因为我切换到应用程序中的REST。对不起,我在这里帮不上忙。