Re: Serializers & Deserializers

From: Arun Gupta <>
Date: Tue, 16 Apr 2002 15:42:41 -0700

Hi Michael,

I'm attaching files to demonstrate the usage of String[] and an array of
a complex type in a DII client. The files are:

- service endpoint interface
- service endpoint class
- DII client to invoke the service
- config.xml
- web.xml

I ran these file on JWSDP EA2 and the client printed all the results

Thanks for your interest in JAX-RPC.


YAWN,MICHAEL (HP-Cupertino,ex1) wrote:

>I'm having difficulty getting serializers and deserializers to work. I'm
>using the code provided
>by Arun last week as a guide, but also looking at the code generated by
>XRPCC to help
>resolve some questions.
>Task 1: Need to serialize a String[].
>- Arun's example code created a SimpleTypeSerializer, but XRPCC uses an
> to handle the String. Is there a reason to prefer one over the other?
>- What is the rule for using ENCODE_TYPE vs DONT_ENCODE_TYPE in the
>serializer constructor
> calls? Arun's code uses DONT_ENCODE for the String, ENCODE for the array.
>The xrpcc-generated
> code has ENCODE_TYPE for both.
>- What is the first parameter to the SimpleTypeArraySerializer constructor?
>Arun's code passes a
> QNAME_TYPE_INT, but the xrpcc-generated code uses the QName for
>'ArrayOfstring'. The type
> of the sixth parameter seems similarly confused.
>- Why does XRPCC use the constant NS_SOAP_ENCODING, while Arun's code uses
> URI_ENCODING for the same purpose, and in my code neither will work -- I
>must use
>- What is the rule for using SERIALIZE_AS_REF vs. DONT_SERIALIZE_AS_REF in
> ReferenceableSerializerImpl constructor?
>- My code as written fails with 'Illegal MimeHeader name or value'. Does
>this provide any
> insight into where my problem is likely to be?
>Task 2: Need to serialize an array of a complex type
>- Is there an example available for serializing a complex type? I have a
>type which consists
> of an int[], a String, and a float. It's hard to follow exactly how this
>is being done in the
> xrpcc-generated code since it seems to be spread across several classes.
>Any available documentation on these constructor calls would go a long way
>helping me get these examples working. I can send (via list or separately)
>source for
>the client program if desired.

There is only one me, I must live myself!
There is only one today, I must live itself!

package duke;

public class Complex {
        private String foo;
        private int bar;

        public Complex() { }

        public Complex(String foo, int bar) {
       = foo;
       = bar;

        public void setFoo(String foo) { = foo; }
        public void setBar(int bar) { = bar; }

        public String getFoo() { return foo; }
        public int getBar() { return bar; }

        public String toString() {
                return foo + ", " + bar;

        public boolean equals(Complex that) {
                if (that == null)
                        return false;

                return ( &&
                        ( ==;

package duke;

import java.rmi.RemoteException;

import javax.xml.rpc.Call;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.namespace.QName;
import javax.xml.rpc.encoding.TypeMapping;
import javax.xml.rpc.encoding.TypeMappingRegistry;
import javax.xml.rpc.encoding.SerializerFactory;
import javax.xml.rpc.encoding.DeserializerFactory;

import com.sun.xml.rpc.client.dii.CallPropertyConstants;

import com.sun.xml.rpc.encoding.CombinedSerializer;
import com.sun.xml.rpc.encoding.ObjectArraySerializer;
import com.sun.xml.rpc.encoding.SimpleTypeArraySerializer;
import com.sun.xml.rpc.encoding.SimpleTypeSerializer;
import com.sun.xml.rpc.encoding.simpletype.XSDStringEncoder;

import com.sun.xml.rpc.encoding.SerializerConstants;
import com.sun.xml.rpc.encoding.SingletonSerializerFactory;
import com.sun.xml.rpc.encoding.SingletonDeserializerFactory;

import com.sun.xml.rpc.encoding.soap.SOAPConstants;
import com.sun.xml.rpc.wsdl.document.schema.SchemaConstants;
import com.sun.xml.rpc.encoding.ReferenceableSerializerImpl;

public class DIIClient implements CallPropertyConstants, SerializerConstants {

        QName stringQname = null;
        QName stringArrayTypeQname = null;
        QName stringArrayElementQname = null;

        QName complexQname = null;
        QName complexArrayTypeQname = null;
        QName complexArrayElementQname = null;

        final String TYPE_NAMESPACE_VALUE = "";
        final String WSDL_NAMESPACE_VALUE = "";

        ServiceFactory factory = null;

        public static void main(String[] args) {
                DIIClient client = new DIIClient();

        public DIIClient() {
                try {
                        stringArrayTypeQname = new QName(TYPE_NAMESPACE_VALUE, "ArrayOfstring");
                        stringArrayElementQname = new QName("", "string");

                        complexQname = new QName(TYPE_NAMESPACE_VALUE, "Complex");
                        complexArrayTypeQname = new QName(TYPE_NAMESPACE_VALUE, "ArrayOfComplex");
                        complexArrayElementQname = new QName("", "Complex");

                        factory = ServiceFactory.newInstance();
                } catch (Exception ex) {

        void echoString() {
                String result = null;

                System.out.println("Echoing a String ...");
                try {
                        Call call = newStringCall();
                        call.setOperationName(new QName(WSDL_NAMESPACE_VALUE, "echoString"));
                        String[] params = { "Duke!" };
                        result = (String)call.invoke(params);
                } catch (Exception ex) {
                System.out.println(" ... done.\n");

        void echoStringArray() {
                String[] result = null;

                System.out.println("Echoing an array of String ...");
                try {
                        Call call = newStringCall();
                        call.setOperationName(new QName(WSDL_NAMESPACE_VALUE, "echoStringArray"));
                        result = (String[])call.invoke(null);
                        for (int i=0; i<result.length; i++)
                } catch (Exception ex) {
                System.out.println(" ... done.\n");

        void echoComplex() {
                Complex result = null;

                System.out.println("Echoing a complex type ...");
                try {
                        Call call = newComplexCall();

                        call.setOperationName(new QName(WSDL_NAMESPACE_VALUE, "echoComplex"));
                        call.addParameter("Complex_1", complexQname, ParameterMode.PARAM_MODE_IN);
                        Complex[] params = { new Complex("Duke", 8) };
                        result = (Complex)call.invoke(params);
                } catch (Exception ex) {
                System.out.println(" ... done.\n");

        void echoComplexArray() {
                Complex[] result = null;

                System.out.println("Echoing an array of complex type ...");
                try {
                        Call call = newComplexCall();

                        call.setOperationName(new QName(WSDL_NAMESPACE_VALUE, "echoComplexArray"));
                        Complex[] array = { new Complex("Duke", 7), new Complex("Java", 8) };
                        Object[] params = { array };
                        result = (Complex[])call.invoke(params);

                        for (int i=0; i<result.length; i++)
                } catch (Exception ex) {
                System.out.println(" ... done.\n");

        Call newStringCall() throws Exception {
                CombinedSerializer stringSerializer = new SimpleTypeSerializer(SchemaConstants.QNAME_TYPE_STRING, DONT_ENCODE_TYPE, NULLABLE, SOAPConstants.URI_ENCODING, XSDStringEncoder.getInstance());
                CombinedSerializer stringArraySerializer = new SimpleTypeArraySerializer(stringArrayTypeQname, ENCODE_TYPE, NULLABLE, SOAPConstants.URI_ENCODING, null, SchemaConstants.QNAME_TYPE_STRING, String.class, 1, null, (SimpleTypeSerializer)stringSerializer);
                stringArraySerializer = new ReferenceableSerializerImpl(SERIALIZE_AS_REF, stringArraySerializer);

                SerializerFactory stringArraySerializerFactory = new SingletonSerializerFactory(stringArraySerializer);
                DeserializerFactory stringArrayDeserializerFactory = new SingletonDeserializerFactory(stringArraySerializer);

                Service service = factory.createService(new QName("Duke"));
                QName port = new QName(TYPE_NAMESPACE_VALUE, "DIIPort");

                TypeMappingRegistry registry = service.getTypeMappingRegistry();
                TypeMapping typeMapping = registry.getTypeMapping(SOAPConstants.URI_ENCODING);
                typeMapping.register(String[].class, stringArrayTypeQname, stringArraySerializerFactory, stringArrayDeserializerFactory);

                Call call = newCall(service, port);

                return call;

        Call newComplexCall() throws Exception {
                CombinedSerializer complexSerializer = new Complex_SOAPSerializer(complexQname, ENCODE_TYPE, NULLABLE, SOAPConstants.URI_ENCODING);
                complexSerializer = new ReferenceableSerializerImpl(SERIALIZE_AS_REF, complexSerializer);
                SerializerFactory complexSerializerFactory = new SingletonSerializerFactory(complexSerializer);
                DeserializerFactory complexDeserializerFactory = new SingletonDeserializerFactory(complexSerializer);

                CombinedSerializer complexArraySerializer = new ObjectArraySerializer(complexArrayTypeQname, ENCODE_TYPE, NULLABLE, SOAPConstants.URI_ENCODING, complexArrayElementQname, complexQname, Complex.class, 1, null);
                complexArraySerializer = new ReferenceableSerializerImpl(SERIALIZE_AS_REF, complexArraySerializer);
                SingletonSerializerFactory complexArraySerializerFactory = new SingletonSerializerFactory(complexArraySerializer);
                SingletonDeserializerFactory complexArrayDeserializerFactory = new SingletonDeserializerFactory(complexArraySerializer);

                Service service = factory.createService(new QName("Duke"));
                QName port = new QName(TYPE_NAMESPACE_VALUE, "DIIPort");

                TypeMappingRegistry registry = service.getTypeMappingRegistry();
                TypeMapping typeMapping = registry.getTypeMapping(SOAPConstants.URI_ENCODING);
                typeMapping.register(Complex.class, complexQname, complexSerializerFactory, complexDeserializerFactory);
                typeMapping.register(Complex[].class, complexArrayTypeQname, complexArraySerializerFactory, complexArrayDeserializerFactory);

                Call call = newCall(service, port);

                return call;

        Call newCall(Service service, QName port) throws Exception {
                Call call = service.createCall();

                call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true));
                call.setProperty(Call.SOAPACTION_URI_PROPERTY, "");
                call.setProperty(ENCODING_STYLE_PROPERTY, SOAPConstants.URI_ENCODING);

                return call;

package duke;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface DIIPort extends Remote {
        public String echoString(String s) throws RemoteException;
        public String[] echoStringArray() throws RemoteException;

        public Complex echoComplex(Complex complex) throws RemoteException;
        public Complex[] echoComplexArray(Complex[] complexArray) throws RemoteException;

package duke;

public class DIIService implements DIIPort {
        public String echoString(String string) {
                return string;

        public String[] echoStringArray() {
                String[] stringArray = { "Duke", "Rocks" };

                return stringArray;

        public Complex echoComplex(Complex complex) {
                return complex;

        public Complex[] echoComplexArray(Complex[] complexArray) {
                return complexArray;