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