The "literal" encoding that you describe below matches how the current bean serializer/deserializer deals with indexed properties.
So instead of changing the array serializer/deserializer, you just may need to change the bean serializer to treat arrays like indexed properties when the "literal" flag is set. Of course you will need to use another approach if these types of arrays are not always within a bean. I can help you do this if you would like. Rich Scheuerle XML & Web Services Development 512-838-5115 (IBM TL 678-5115) [EMAIL PROTECTED] rg To: [EMAIL PROTECTED] cc: 01/31/2002 10:12 Subject: cvs commit: xml-axis/java/src/org/apache/axis/encoding/ser PM ArraySerializer.java Please respond to axis-dev gdaniels 02/01/31 20:12:28 Modified: java/src/org/apache/axis/encoding SerializationContextImpl.java SerializationContext.java java/src/org/apache/axis MessageContext.java java/src/org/apache/axis/encoding/ser ArraySerializer.java Log: Support serializing Arrays in "literal" fashion (a .NET-ism). We introduce an "isEncoded" flag on the MessageContext for now - this really wants to get set to the encoding state we're in at present, but I couldn't figure out how to coax that out of the serialization code yet. Let's say we have: class Bean { public String field1; public String [] field2; } if isEncoded is true (the default), we get XML that looks like: <bean> <field1>hi there</field1> <field2 SOAPENC:arrayType="xsd:string[2]"> <item>1</item> <item>2</item> </field2> </bean> whereas if isEncoded is false, we now get: <bean> <field1>hi there</field1> <field2>1</field2> <field2>2</field2> </bean> TODOs: 1) Figure out how to get encodingStyle for real 2) Implement deserializing from arrays encoded like this Revision Changes Path 1.4 +8 -1 xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java Index: SerializationContextImpl.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- SerializationContextImpl.java 29 Jan 2002 21:31:38 -0000 1.3 +++ SerializationContextImpl.java 1 Feb 2002 04:12:28 -0000 1.4 @@ -334,7 +334,14 @@ return msgContext.getCurrentMessage(); } - /** + /** + * Get the MessageContext we're operating with + */ + public MessageContext getMessageContext() { + return msgContext; + } + + /** * Convert QName to a string of the form <prefix>:<localpart> * @param QName * @return prefixed qname representation for serialization. 1.73 +6 -1 xml-axis/java/src/org/apache/axis/encoding/SerializationContext.java Index: SerializationContext.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SerializationContext.java,v retrieving revision 1.72 retrieving revision 1.73 diff -u -r1.72 -r1.73 --- SerializationContext.java 26 Jan 2002 02:40:33 -0000 1.72 +++ SerializationContext.java 1 Feb 2002 04:12:28 -0000 1.73 @@ -186,7 +186,12 @@ */ public Message getCurrentMessage(); - /** + /** + * Get the MessageContext we're operating with + */ + public MessageContext getMessageContext(); + + /** * Convert QName to a string of the form <prefix>:<localpart> * @param QName * @return prefixed qname representation for serialization. 1.69 +17 -0 xml-axis/java/src/org/apache/axis/MessageContext.java Index: MessageContext.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/MessageContext.java,v retrieving revision 1.68 retrieving revision 1.69 diff -u -r1.68 -r1.69 --- MessageContext.java 6 Dec 2001 17:09:40 -0000 1.68 +++ MessageContext.java 1 Feb 2002 04:12:28 -0000 1.69 @@ -155,6 +155,12 @@ * MessageContext. */ private Hashtable bag ; + + /** + * Are we using SOAP encoding? Default is true for RPC services, + * should be set to false for document/literal. + */ + private boolean isEncoded = true; /** * Get the active message context. @@ -220,6 +226,17 @@ this.session = session; } + /** + * Encoding + */ + public boolean isEncoded() { + return isEncoded; + } + + public void setEncoded(boolean encoded) { + isEncoded = encoded; + } + /** * Set whether we are maintaining session state */ 1.5 +46 -31 xml-axis/java/src/org/apache/axis/encoding/ser/ArraySerializer.java Index: ArraySerializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/ArraySerializer.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ArraySerializer.java 31 Jan 2002 21:52:19 -0000 1.4 +++ ArraySerializer.java 1 Feb 2002 04:12:28 -0000 1.5 @@ -209,38 +209,53 @@ } } - AttributesImpl attrs; - if (attributes != null) { - if (attributes instanceof AttributesImpl) { - attrs = (AttributesImpl)attributes; + // Are we encoded? + boolean isEncoded = context.getMessageContext().isEncoded(); + + if (isEncoded) { + AttributesImpl attrs; + if (attributes != null) { + if (attributes instanceof AttributesImpl) { + attrs = (AttributesImpl)attributes; + } else { + attrs = new AttributesImpl(attributes); + } } else { - attrs = new AttributesImpl(attributes); + attrs = new AttributesImpl(); + } + + if (attrs.getIndex(Constants.URI_CURRENT_SOAP_ENC, + Constants.ATTR_ARRAY_TYPE) == -1) { + String encprefix = + context.getPrefixForURI(Constants.URI_CURRENT_SOAP_ENC); + attrs.addAttribute(Constants.URI_CURRENT_SOAP_ENC, + Constants.ATTR_ARRAY_TYPE, + encprefix + ":arrayType", + "CDATA", + arrayType); + } + + // Force type to be SOAP_ARRAY for all array serialization. + int typeI = attrs.getIndex(Constants.URI_CURRENT_SCHEMA_XSI, + "type"); + if (typeI != -1) { + attrs.removeAttribute(typeI); + attributes = context.setTypeAttribute(attrs, + Constants.SOAP_ARRAY); + } else { + attributes = attrs; } - } else { - attrs = new AttributesImpl(); - } - - if (attrs.getIndex(Constants.URI_CURRENT_SOAP_ENC, - Constants.ATTR_ARRAY_TYPE) == -1) { - String encprefix = context.getPrefixForURI(Constants.URI_CURRENT_SOAP_ENC); - attrs.addAttribute(Constants.URI_CURRENT_SOAP_ENC, - Constants.ATTR_ARRAY_TYPE, - encprefix + ":arrayType", - "CDATA", - arrayType); } - // Force type to be SOAP_ARRAY for all array serialization. - int typeI = attrs.getIndex(Constants.URI_CURRENT_SCHEMA_XSI, - "type"); - if (typeI != -1) { - attrs.removeAttribute(typeI); - attributes = context.setTypeAttribute(attrs, Constants.SOAP_ARRAY); - } else { - attributes = attrs; - } + // For non-encoded (literal) use, each item is named with the QName + // we got in the arguments. For encoded, we write an element with + // that QName, and then each item is an <item> inside that. + QName elementName = name; - context.startElement(name, attributes); + if (isEncoded) { + context.startElement(name, attributes); + elementName = new QName("","item"); + } if (dim2Len < 0) { // Normal case, serialize each array element @@ -248,7 +263,7 @@ Object aValue = (list == null) ? Array.get(value, index) : list.get(index); Class aClass = (aValue == null) ? null : aValue.getClass (); - context.serialize(new QName("","item"), null, aValue, aClass); + context.serialize(elementName, null, aValue, aClass); } } else { // Serialize as a 2 dimensional array @@ -256,13 +271,13 @@ for (int index2 = 0; index2 < dim2Len; index2++) { Object aValue = Array.get(Array.get(value, index), index2); Class aClass = (aValue == null) ? null : aValue.getClass(); - context.serialize(new QName("","item"), null, aValue, aClass); + context.serialize(elementName, null, aValue, aClass); } } } - - context.endElement(); + if (isEncoded) + context.endElement(); } public String getMechanismType() { return Constants.AXIS_SAX; }