I think we do something like this in our SRU/SRW bridge (full source http://www.jafer.org/source/wsvn/JAFER/trunk/src/org/jafer/sru/?rev=0&sc =0 ), but I didn't write the code for that myself. This goes one way: // obtain the serialiser to return this to XML QName searchQName = new QName("http://www.loc.gov/zing/srw/", "searchRetrieveResponse"); Serializer ser = SearchRetrieveResponseType.getSerializer(null, SearchRetrieveResponseType.class, searchQName); StringWriter responseWriter = new StringWriter(); ser.serialize(searchQName, null, response, new SerializationContext(responseWriter)); String SRWResult = responseWriter.getBuffer().toString(); I've a vague recollection we had something going the other way but can't find it at the moment... Matthew > -----Original Message----- > From: SRU (Search and Retrieve Via URL) Implementors > [mailto:[log in to unmask]] On Behalf Of LeVan,Ralph > Sent: 06 June 2007 16:24 > To: [log in to unmask] > Subject: Re: Using the SRWSoapBindingStub to deserialize? > > Yes, I am trying to do object serialization/deserialization outside the > SOAP environment, but find the objects created by the Apache Axis > toolkit too convenient to give up. So, I was looking for ways to > switch > between the XML request/responses and the appropriate objects. I think > I've pretty well mastered that. > > Ralph > > > import gov.loc.www.zing.srw.ScanRequestType; > import gov.loc.www.zing.srw.ScanResponseType; > import gov.loc.www.zing.srw.SearchRetrieveRequestType; > import gov.loc.www.zing.srw.SearchRetrieveResponseType; > import java.io.IOException; > import java.io.StringReader; > import java.io.StringWriter; > import javax.xml.namespace.QName; > import org.apache.axis.MessageContext; > import org.apache.axis.encoding.DeserializationContext; > import org.apache.axis.encoding.SerializationContext; > import org.apache.axis.encoding.Serializer; > import org.apache.axis.message.RPCElement; > import org.apache.axis.message.SOAPEnvelope; > import org.apache.axis.server.AxisServer; > import org.xml.sax.InputSource; > > public static String objToXml(Object obj) > throws IllegalArgumentException, IOException { > QName qn; > Serializer s; > if(obj instanceof SearchRetrieveRequestType) { > qn=new QName("http://www.loc.gov/zing/srw/", > "searchRetrieveRequest"); > s=((SearchRetrieveRequestType)obj).getSerializer( > null, obj.getClass(), qn); > } > else if(obj instanceof SearchRetrieveResponseType) { > qn=new QName("http://www.loc.gov/zing/srw/", > "searchRetrieveResponse"); > s=((SearchRetrieveResponseType)obj).getSerializer( > null, obj.getClass(), qn); > } > else if(obj instanceof ScanRequestType) { > qn=new QName("http://www.loc.gov/zing/srw/", > "scanRequest"); > > s=((ScanRequestType)obj).getSerializer( > null, obj.getClass(), qn); > } > else if(obj instanceof ScanResponseType) { > qn=new QName("http://www.loc.gov/zing/srw/", > "scanResponse"); > s=((ScanResponseType)obj).getSerializer( > null, obj.getClass(), qn); > } > else throw new IllegalArgumentException( > "Unrecognized object: "+obj.getClass().getName()); > > StringWriter xmlWriter=new StringWriter(); > s.serialize(qn, null, obj, new > SerializationContext(xmlWriter)); > return xmlWriter.toString(); > } > > static String EnvelopeStart="<soapenv:Envelope > xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" > xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" > xmlns:xsi=\"http://www.w3.org/2001/XMLSchema- > instance\"><soapenv:Body>"; > static String EnvelopeEnd="</soapenv:Body></soapenv:Envelope>"; > public static Object xmlToObj(String xml) throws Exception { > Object obj; > String leader, soapMessage; > leader=xml.substring(0, 20); > if(leader.toLowerCase().startsWith("<?")) { > // contains processing instruction. Strip that off > int i=xml.indexOf("Envelope"); > if(i<0) > throw new IllegalArgumentException("XML starts with > processing instruction but contains no SOAP Envelope"); > while(i>0 && xml.charAt(i)!='<') > i--; > if(i==0) > throw new IllegalArgumentException("XML starts with > processing instruction but contains no SOAP Envelope element"); > soapMessage=xml.substring(i); > } > else if(leader.contains("Envelope")) // use it as it is > soapMessage=xml; > else // add the soap envelope wrapper > soapMessage=EnvelopeStart+xml+EnvelopeEnd; > DeserializationContext dser = new DeserializationContext( > new InputSource(new StringReader(soapMessage)), > new MessageContext(new AxisServer()), > org.apache.axis.Message.RESPONSE); > dser.parse(); > > SOAPEnvelope env = dser.getEnvelope(); > RPCElement rpcElem = (RPCElement)env.getFirstBody(); > String objectType=rpcElem.getLocalName(); > if(objectType.equals("searchRetrieveRequest")) > > obj=rpcElem.getObjectValue(SearchRetrieveRequestType.class); > else if(objectType.equals("searchRetrieveResponse")) > > obj=rpcElem.getObjectValue(SearchRetrieveResponseType.class); > else if(objectType.equals("scanRequest")) > obj=rpcElem.getObjectValue(ScanRequestType.class); > else if(objectType.equals("scanResponse")) > obj=rpcElem.getObjectValue(ScanResponseType.class); > else > throw new IllegalArgumentException("Unrecognized XML > object: > "+objectType); > return obj; > }