You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-user@axis.apache.org by Tim Bartley <tb...@au1.ibm.com> on 2005/02/10 02:36:35 UTC

Deserialization of arrays of complex elements with nil members

I am using Axis C++ on the client side. One of my operations returns an 
array of:

typedef struct ComplexTag {
        xsd__string value1;
        xsd__string value2;
        xsd__string value3;
} Complex;

typedef struct Complex_ArrayTag {
        Complex** m_Array;
        int m_Size;
} Complex_Array;

If one of the array elements has an empty value for the first value (don't 
know whether it's only the first member or whether the fact that it's an 
array is relevant but that's all I've observed) then all the members of 
the Complex with an empty first member are deserialized as NULL and all 
subsequenet elements of the array are ignored.

The following body fragment illustrates the problem. If the array data is 
returned as (this is being generated by a WebSphere 5.1.1 hosted Web 
service if that's of any interest):

<data>
        <value1>1 - value1</value1>
        <value2>1 - value2</value2>
        <value3>1 - value3</value3>
</data>
<data>
        <value1/>
        <value2>2 - value2</value2>
        <value3>2 - value2</value3>
</data>
<data>
        <value1>3 - value1</value1>
        <value2>3 - value2</value2>
        <value3>3 - value3</value3>
</data>

Then Axis C++ deserializes the array to me as:

Complex_Array array;
array.m_Size == 2
*array.m_Array[0] == { "1 - value1", "1 - value2", "1 - value3" }
*array.m_Array[1] == { NULL, NULL, NULL }

Where I would expect:

array.m_Size == 3
*array.m_Array[0] == { "1 - value1", "1 - value2", "1 - value3" }
*array.m_Array[1] == { NULL,         "2 - value2", "2 - value3" }
*array.m_Array[2] == { "3 - value1", "3 - value2", "3 - value3" }

I have only tried this with the 1.5 alpha release on Linux.

Not sure what the etiquette is but I've also opened this as bug 
AXISCPP-418.

Thanks and regards,

Tim Bartley
--
IBM Tivoli Access Manager Development
Gold Coast Development Lab, Australia
+61-7-5552-4001 phone
+61-7-5571-0420 fax

Re: Deserialization of arrays of complex elements with nil members

Posted by John Hawkins <HA...@uk.ibm.com>.
It's good to open the JIRA :-)

If you could give us the WSDL and anything that you might think relevant 
i.e. if you an capture the wire msg (using TCPMonitor in axis.jar). Just 
attach them to the JIR.

cheers,
John.





Tim Bartley <tb...@au1.ibm.com> 
10/02/2005 01:36
Please respond to
"Apache AXIS C User List"


To
axis-c-user@ws.apache.org
cc

Subject
Deserialization of arrays of complex elements with nil members







I am using Axis C++ on the client side. One of my operations returns an 
array of: 

typedef struct ComplexTag { 
        xsd__string value1; 
        xsd__string value2; 
        xsd__string value3; 
} Complex; 

typedef struct Complex_ArrayTag { 
        Complex** m_Array; 
        int m_Size; 
} Complex_Array; 

If one of the array elements has an empty value for the first value (don't 
know whether it's only the first member or whether the fact that it's an 
array is relevant but that's all I've observed) then all the members of 
the Complex with an empty first member are deserialized as NULL and all 
subsequenet elements of the array are ignored. 

The following body fragment illustrates the problem. If the array data is 
returned as (this is being generated by a WebSphere 5.1.1 hosted Web 
service if that's of any interest): 

<data> 
        <value1>1 - value1</value1> 
        <value2>1 - value2</value2> 
        <value3>1 - value3</value3> 
</data> 
<data> 
        <value1/> 
        <value2>2 - value2</value2> 
        <value3>2 - value2</value3> 
</data> 
<data> 
        <value1>3 - value1</value1> 
        <value2>3 - value2</value2> 
        <value3>3 - value3</value3> 
</data> 

Then Axis C++ deserializes the array to me as: 

Complex_Array array; 
array.m_Size == 2 
*array.m_Array[0] == { "1 - value1", "1 - value2", "1 - value3" } 
*array.m_Array[1] == { NULL, NULL, NULL } 

Where I would expect: 

array.m_Size == 3 
*array.m_Array[0] == { "1 - value1", "1 - value2", "1 - value3" } 
*array.m_Array[1] == { NULL,         "2 - value2", "2 - value3" } 
*array.m_Array[2] == { "3 - value1", "3 - value2", "3 - value3" } 

I have only tried this with the 1.5 alpha release on Linux. 

Not sure what the etiquette is but I've also opened this as bug 
AXISCPP-418. 

Thanks and regards, 

Tim Bartley
--
IBM Tivoli Access Manager Development
Gold Coast Development Lab, Australia
+61-7-5552-4001 phone
+61-7-5571-0420 fax