看了一段關于反序列化的代碼,原來在從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);
}

