看了一段关于反序列化的代码,原来在从xml代码到java代码的时候,有一个重新构造的过程,apache soap用的是org.apache.soap.encoding.soapenc.beanserializer来完成这个工作的.一个java 类是被看作一个bean来处理,重新构造时需要调用set方法,如果没有set方法,或者为private的时候,那么就等于构造了一个空的对象,所以造成了在客户端为空的现象.其实从服务端返回的不为空,只是本地重新构造时出了问题.下面的代码没有用apache默认得反序列化类,而是自己实现的,没有用到set.
public bean unmarshall(string inscopeencstyle, qname elementtype,
node src, xmljavamappingregistry xjmr, soapcontext ctx)
throws illegalargumentexception
{
element root = (element)src;
element tempel = domutils.getfirstchildelement(root);
samples.addressbook2.phone target;
try
{
target =
(samples.addressbook2.phone)samples.addressbook2.phone.class.newinstance
();
}
catch (exception e)
{
throw new illegalargumentexception("problem instantiating bean: "
+ e.getmessage());
}
while (tempel != null)
{
bean parambean = xjmr.unmarshall(inscopeencstyle,
rpcconstants.q_elem_parameter,
tempel, ctx);
parameter param = (parameter)parambean.value;
string tagname = tempel.gettagname();
if (tagname.equals("areacode"))
{
target.areacode_elem = ((integer)param.getvalue()).intvalue();
}
if (tagname.equals("exchange"))
{
target.exchange_elem = (java.lang.string)param.getvalue();
}
if (tagname.equals("number"))
{
target.number_elem = (java.lang.string)param.getvalue();
}
tempel = domutils.getnextsiblingelement(tempel);
}
return new bean(samples.addressbook2.phone.class, target);
}