public Object deserialize(InputStream is, Hashtable extendedContext) throws Exception {

    // getting deserializer
    Class targetCls = (Class) extendedContext.get("targetClass");
    Object objectOfTargetCls = targetCls.newInstance();
    TypeDesc desc =
        (TypeDesc)
            objectOfTargetCls
                .getClass()
                .getMethod("getTypeDesc", new Class[] {})
                .invoke(objectOfTargetCls, new Object[] {});
    final QName xmlType; // = desc.getXmlType();
    xmlType =
        new QName(
            "http://" + objectOfTargetCls.getClass().getName(),
            org.uengine.util.UEngineUtil.getClassNameOnly(objectOfTargetCls.getClass()));
    Deserializer dser =
        (Deserializer)
            objectOfTargetCls
                .getClass()
                .getMethod("getDeserializer", new Class[] {String.class, Class.class, QName.class})
                .invoke(
                    objectOfTargetCls, new Object[] {"", objectOfTargetCls.getClass(), xmlType});
    // end
    System.out.println("dser:" + dser);

    DeserializationContext context =
        new DeserializationContextImpl(
            new org.xml.sax.InputSource(is),
            /*			new MessageContext(null){
            	public String getEncodingStyle(){
            		return xmlType.getNamespaceURI();
            	}
            },*/
            new MessageContext(new AxisClient()),
            // Message.RESPONSE
            "PurchaseOrder");

    boolean oldVal = context.isDoneParsing();
    ((DeserializationContextImpl) context).deserializing(true);
    context.pushElementHandler(new EnvelopeHandler((SOAPHandler) dser));

    //	        context.getRecorder().replay(0, -1, (org.xml.sax.ContentHandler)context);
    context.getRecorder().replay(0, -1, (org.xml.sax.ContentHandler) context);

    ((DeserializationContextImpl) context).deserializing(oldVal);

    context.parse();

    return dser.getValue();
  }
  public void serialize(Object sourceObj, OutputStream os, Hashtable extendedContext)
      throws Exception {

    try {
      final ClassLoader urlClassLoader = GlobalContext.getComponentClassLoader();
      /* this will replace the default system class loader with the new custom classloader, so that XMLEncoder will use the new custom classloader to lookup a class */
      Thread.currentThread().setContextClassLoader(urlClassLoader);
    } catch (Exception e) {
      System.out.println("can't replace classloader");
    }

    try {
      TypeDesc desc =
          (TypeDesc)
              sourceObj
                  .getClass()
                  .getMethod("getTypeDesc", new Class[] {})
                  .invoke(sourceObj, new Object[] {});
      QName xmlType = desc.getXmlType();
      //
      // xmlType = (QName)extendedContext.get("qName");
      //
      xmlType =
          new QName(
              "http://" + sourceObj.getClass().getName(),
              org.uengine.util.UEngineUtil.getClassNameOnly(sourceObj.getClass()));
      //			xmlType = new QName(Constants.URI_SOAP11_ENV, Constants.ELEM_ENVELOPE );

      org.apache.axis.encoding.Serializer ser =
          (org.apache.axis.encoding.Serializer)
              sourceObj
                  .getClass()
                  .getMethod("getSerializer", new Class[] {String.class, Class.class, QName.class})
                  .invoke(sourceObj, new Object[] {"", sourceObj.getClass(), xmlType});

      // Writer w = new OutputStreamWriter(os);
      StringWriter w = new StringWriter();
      SerializationContext context =
          new SerializationContextImpl(w) {
            public MessageContext getMessageContext() {
              return new MessageContext(null) {
                public String getEncodingStyle() {
                  return "";
                }
              };
            }
          };
      ser.serialize(xmlType, (org.xml.sax.Attributes) null, sourceObj, context);

      // System.out.println(w);
      // w.write("SdfasdfsadfA");

      BufferedOutputStream bao = new BufferedOutputStream(os);

      bao.write(w.toString().getBytes());

      bao.flush();
      bao.close();

    } catch (Exception e) {
      e.printStackTrace();
    }
  }