I was referring to arrays specified using the proper (WS-I recommended) syntax. (<element name="array_element" type="xsd:double" minOccurs="0" maxOccurs="unbounded"/> )
Axis doesn't use the element name specified in the WSDL (in this case "array_element") as the name of the array elements. The namespace issues also pertain to this case. -Eric -----Original Message----- From: Jeff Greif [mailto:[EMAIL PROTECTED] Sent: Wednesday, September 29, 2004 12:06 PM To: [EMAIL PROTECTED] Subject: Re: Array of Objects in Axis and .NET interop There is no way in WSDL or XML Schema to define the names of the array elements used in SOAP encoding, which is underspecified.. The schema type for soap:ArrayType specifies <any> element to be used for the array elements. They are completely arbitrary. It would be OK, if very perverse, if some server randomly generated different names on every call. Also, these elements belong in the null namespace because they are not specified in any schema. I think this is one of the reasons the Basic Profile advises against using encoded forms. Jeff ----- Original Message ----- From: "Eric Chijioke" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Cc: "Tami Wright" <[EMAIL PROTECTED]> Sent: Wednesday, September 29, 2004 7:01 AM Subject: RE: Array of Objects in Axis and .NET interop ... - I know that axis hardcodes the names of the elements of the array as <item>. Axis doesn't seem to interrogate the WSDL to figure out the 'proper' array element names (!?). - There's one more change I made to my Axis code which I realize I left out. It fixed some namespace issues wherein under certain circumstances, Axis would asign an empty namespace attribute (xmlns="") to the elements of the serialized array, if they were in the default namespace. The change is made to the org.apache.axis.encoding.SerializationContextImpl.serializeActual() method. I added these lines: ------------ begin snippet ------------------------------------ if (elemQName.getNamespaceURI() == ""){ elemQName = new QName(this.nsStack.getNamespaceURI(""), elemQName.getLocalPart()); } ------------ end snippet -------------------------------------- Before this line: ------------ begin snippet (Line# 1231) ------------------------ ser.serialize(elemQName, attributes, value, this); return; ------------ end snippet -------------------------------------- Though these changes (above and below in this thread) seem to make sense, I must make the disclaimer that I have not done any systematic testing to make sure that these changes do not break a configuration that I am not using. Per peoples requests, I am just posting my resolution to the Axis' array serialization/deserialization interoperability problems - as is. - Eric -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Sent: Monday, September 27, 2004 6:55 PM To: [EMAIL PROTECTED] Subject: RE: Array of Objects in Axis and .NET interop I tried this same approach but I then received an unknown element exception with the Axis Java client. In addition I didn't care for the defaulted hardcoding of the "item" name which was causing problems in the .NET client (especially in a situation where the modification of the generated .NET client is not possible). In addition I found that this change caused a service method that returns an array to not return the correct xml results since it added extra wrapper and used item. NOTE: I have discovered also that by removing the field type description for the array property from the helper class causes the serializer to output correctly, with the wrapping element. (although the Axis client is unable to correctly deserialize). marcus -----Original Message----- From: Eric Chijioke [mailto:[EMAIL PROTECTED] Sent: Monday, September 27, 2004 12:30 PM To: [EMAIL PROTECTED] Cc: Tami Wright Subject: RE: Array of Objects in Axis and .NET interop Tami, Here's what I've done to make it work with .NET: I've located the following code in the org.apache.axis.encoding.ser.ArraySerializer.serialize() method And in both places, commented out the if(...) condition in order to place an array wrapper around the elements for arrays specified using the <element minOccurs="0" maxOccurs="unbounded"...> WSDL syntax. ------------ begin snippet (Line# 322) ------------------------ // if (!maxOccursUsage) { //****** commented out *****// serializeAttr = null; // since we are putting them here context.startElement(name, attributes); elementName = Constants.QNAME_LITERAL_ITEM; // } //****** commented out *****// ------------ end snippet -------------------------------------- With the corresponding serialization of a closing wrapper later on: ------------ begin snippet (Line# 363)-------------------------- // if (!maxOccursUsage) //****** commented out *****// context.endElement(); ------------ end snippet --------------------------------------- In order to set the appropriate type of array elements, I also changed the following code (a bit of a blind hack, but it works) in the same method FROM: ------------ begin snippet (Line# 336)-------------------------- context.serialize(elementName, serializeAttr, aValue, componentQName, // prefered type QName true, // Send null values null); // Respect default type config ------------ end snippet --------------------------------------- TO: ------------ begin snippet ------------------------------------- context.serialize(elementName, serializeAttr, aValue, msgContext.getTypeMapping().getXMLType(aValue.getClass(),null,encoded), // prefered type QName true, // Send null values null); // Respect default type config ------------ end snippet --------------------------------------- Remember, your .NET client needs to use the System.Xml.Serialization.XmlArrayItemAttribute("item")] attribute on your web service methods (in your Reference.cs file) in order to consume arrays serialized form axis with elements named <item>. I hope this helps, Eric -----Original Message----- From: Tami Wright [mailto:[EMAIL PROTECTED] Sent: Monday, September 27, 2004 12:25 PM To: [EMAIL PROTECTED] Subject: Array of Objects in Axis and .NET interop Hi, I wondered what the status was with the message thread originally posted by Eric Chijioke entitled "Axis and .NET interoperability - Arrays". Any interim solution that can be posted until the bug is resolved would be appreciated. Best Regards, tami