For Apache SOAP, I wrap the following class around my complex types to provide bean info and use their BeanSerializer.  You may need to remove leading capitals at some point; I don't need to in my implementation.

I hope it helps you; here it is in its entirety:

//---------------------------------------------------------------------------------------
// DefaultBeanInfo.java
//
// $Id: DefaultBeanInfo.java,v 1.2 2002/09/17 08:38:20 nbrennan Exp $
//---------------------------------------------------------------------------------------

// java imports
import java.util.*;
import java.beans.*;
import java.lang.reflect.*;

//---------------------------------------------------------------------------------------
//
// DefaultBeanInfo
/**
 * Class to extract the array of bean property descriptors for the supplied bean class.
 *
 * @author $Author: nbrennan $
 * @version $Revision: 1.2 $
 */

public class DefaultBeanInfo extends SimpleBeanInfo
{
// PRIVATE ATTRIBUTES

    /** class for which we will provide info */
    private Class m_class = null;

// CONSTRUCTORS

    /**
     * Constructor
     *
     * Creates a bean info class from the supplied bean class.
     */
    public DefaultBeanInfo(Class cl)
    {
         m_class = cl;
    }

// PUBLIC METHODS

    //
    // getPropertyDescriptors()
    /**
     * Gets the property descriptors for all isXXX()/getXXX() and setXXX() methods of the
     * supplied bean.
     *
     * @return the array of property descriptors.
     */
    public PropertyDescriptor[] getPropertyDescriptors()
    {
        Set attributes = new TreeSet();

        // add all 'get' attributes to the attributes set
        findAttributes(attributes, "get");

        // add all 'is' attributes to the attributes set
        findAttributes(attributes, "is");

        // add all 'set' attributes to the attributes set
        findAttributes(attributes, "set");

        // create a list of property descriptors
        List descriptors = new ArrayList();
        try
        {
            // for each discovered attribute
            for (Iterator i=attributes.iterator(); i.hasNext();)
            {
                String attribute = (String)i.next();

                // if both get/is and set methods exist
                Method set = findMethod("set" + attribute);
                if (set == null)
                    continue;
                Method get = findMethod("get" + attribute);
                if (get == null)
                {
                    get = findMethod("is" + attribute);
                    if (get == null)
                        continue;
                }

                // create a property descriptor and add it to the list
                descriptors.add(new PropertyDescriptor(attribute, get, set));
            }
        }
        catch (IntrospectionException iexErr)
        {
            // interface requires that we not throw any special exceptions
            throw new Error(iexErr.toString());
        }

        // done
        return (PropertyDescriptor[])descriptors.toArray(new PropertyDescriptor[]{});
    }

// PRIVATE METHODS

    //
    // findMethod()
    /**
     * @return the first method whose name exactly matches the supplied name.
     */
    private Method findMethod(String name)
    {
        Method[] methods = m_class.getMethods();
        if (methods != null)
            for (int i=0; i < methods.length; ++i)
            {
                // process each method
                Method method = methods[i];
                String methodName = method.getName();

                // return first match
                if (name.equals(methodName))
                {
//System.out.println("method: " + methodName);
                    return method;
                }
            }
        return null;
    }

    //
    // findAttributes()
    /**
     * @return all bean attributes that begin with the supplied prefix.
     */
    private void findAttributes(Set attributes, String prefix)
    {
        Method[] methods = m_class.getMethods();
        if (methods != null)
            for (int i=0; i < methods.length; ++i)
            {
                // process each method
                Method method = methods[i];
                String methodName = method.getName();

                // validate
                if (methodName == null)
                    continue;

                // if method name starts with the supplied prefix
                if (methodName.startsWith(prefix))
                {
                    // add method suffix (the attribute) to the map
                    attributes.add(methodName.substring(prefix.length()));
                }
            }
    }

}

-----Original Message-----
From: psorin@regens.hu [mailto:psorin@regens.hu]
Sent: Wednesday, 18 September 2002 21:55
To: axis-user@xml.apache.org
Subject: Re: Serializer/Deserializer

I only know the one in the AXIS documentation, which is not really much...

----- Original Message -----
From: "Deepth Dinesan" <dinesan@india.adventnet.com>
To: <axis-user@xml.apache.org>
Sent: Wednesday, September 18, 2002 1:44 PM
Subject: Re: Serializer/Deserializer

> Hi Sorin,
>
> In fact am trying to convert an exising RMI Server to emit SOAP messages.
> [ Convert Java Serialization to SOAP Serialization ]
>
> Some of these classes are immutable and already define
ObjectStreamFields[]
> ,readObject(), and writeObject() for Java Object Serialization . Am
wondering
> why couldnt these be reused rather than defining a set of
> serializers/deserializers which does the same .
>
> Probably I need to look deep inside and see how reflection is being done
in axis
> .
> Are there any docs on typeMapping ?
>
> ThanX
> Deepth
>
>
>
>
> Sorin Pop wrote:
>
> > I guess you could use the builtin bean (de)serializer, that is, tha
> > beanmapping tag in the deploy.wsdd file.
> >
> > Theoretically you will be able to serialize all the public members of
your
> > types and you don't have to write custom (de)serializers. I have been
> > experiencing with the same issue the last few days, and for me it works,
> > true, I tried it with a quite simplistic scenario. I don't know how your
> > types look like, though. The only problem I encountered so far was that
if I
> > had a type X wich had a member array of Y objects, then it didn't work
> > unless a wrote a getter/setter method pair for the Y[] member.
> >
> > Here is the letter I sent on this mailing list a few days ago, nobody
really
> > replied to it until now:
> >
> > Hi,
> >
> > allegedly AXIS 1.0rc can handle the (de)serialization of custom objects
with
> > the builtin bean (de)serializer classes (beanmapping tag in the WSDD),
and
> > these custom objects don't necessarily need to have getter/setter
methods
> > anymore, it's enough for the (serializable) members to be declared
public.
> >
> > I tried it out, and it looks like it works, only to a certain point
though:
> > when the custom object contains a public member which is an array of
another
> > custom object. Then AXIS can handle the (de)serialization of the big
object
> > only if I write, like before, a custom (de)serializer class for it (and
I
> > have a typemapping tag in the deploy.wsdd file for the big object). If I
use
> > the beanmapping tag for it, then I get the following error messages
(lets
> > say the big class is called X, the little one Y, so X contains an array
of
> > Ys, which is called y_array):
> >
> >     java.lang.IllegalArgument Exception: array element type mismatch
> >     Could not convert [LY; to bean field y_array[0], type Y
> >
> > I don't know where that [L in front of the class name comes from, maybe
the
> > problem is related to that...
> > I have checked the SOAP message AXIS gets from the client, and I haven't
> > seen anything unusual in it. When I comment out the beanmapping tag and
> > uncover the typemapping tag for the X (yes, X, not Y, Y has a
beanmapping
> > tag) class in the WSDD (which points to the custom (de)serializer
classes),
> > and I redeploy the web service, then it works again.
> >
> > Has anybody encountered this problem? Any suggestions?
> >
> > Thanks.
> > ----- Original Message -----
> > From: "Deepth Dinesan" <dinesan@india.adventnet.com>
> > To: <axis-user@xml.apache.org>
> > Sent: Wednesday, September 18, 2002 11:15 AM
> > Subject: Serializer/Deserializer
> >
> > > Hi all,
> > >
> > > I have some (about 25)  user defined types that I need to serialize .
> > > These classses
> > > are fairly complex making use of  inheritance and aggregation
> > > extensively .
> > > Is there a way by which I can avoid writing serializers/deserializers
> > > and still be able to serialize .
> > >
> > > Eg:
> > >
> > > (1) I may use the ObjectStreamFields and the transient keyword to find
> > > which fields needs to be serialized  !!
> > > (2) I can have a java2schema generator. and then I may defines a map
> > > file which axis may use to serialize/deserialize . In fact this
approach
> > > is being used by MindElectric in thei GLUE product . Pretty Clean way
!!
> > >
> > > ThanX
> > > Deepth
> > >
> > >
> > > --
> > > "You have Brains in Your Head,You have feet in your Shoes"
> > > "You can steer yourself any direction you choose"
> > >
> > >
>
> --
> "You have Brains in Your Head,You have feet in your Shoes"
> "You can steer yourself any direction you choose"
>
>