[Melbourne-pm] SOAP::Lite Serializing Complex objects.

Daniel Golembo dgolembo at unimelb.edu.au
Sun Jan 22 19:58:56 PST 2006


I have a problem serializing complex objects while using SOAP::Lite.  
The issue is, if I have a complex object, that iteslf contains a complex 
object, the second object does not get correctly encoded in the SOAP 
envelope. 

For Example, I have an object that needs to be sent as an argument in a 
SOAP call:

my $expression = bless( {
                 'descriptor' => bless( {
                                        'sum' => '1000',
                                        'description' => 'Adding 900 to 100'
                                      }, 'sample_Descriptor' ),
                 'a' => '900',
                 'b' => '100',
                 'dateAdded' => '2006-01-23T03:32:03.781Z'
               }, 'sample_SumExpression' );

and I have SOAP serializer functions to serialize sample_SumExpression 
and sample_Descriptor like:

sub SOAP::Serializer::as_sample_SumExpression {
    my $self = shift;
    my($value, $name, $type, $attr) = @_;

    my $a=SOAP::Data->new(value=>$value->{a}, type=>'string');
    my $b=SOAP::Data->new(value=>$value->{b}, type=>'string');
    my $dateAdded=SOAP::Data->new(value=>$value->{dateAdded}, 
type=>'dateTime');
    my $descriptor=SOAP::Data->new(value=>$value->{descriptor}, 
type=>'ns1:sample_Descriptor');
    my $rval=[$name, {'xsi:type'=>'ns1:sample_SumExpression', %$attr}, 
{a=>$a, b=>$b, dateAdded=>$dateAdded, descriptor=>$descriptor}];
    return $rval;
}

and

sub SOAP::Serializer::as_sample_Descriptor {
    print "Firing SOAP::Serializer::as_unimelb_merlin_Descriptor\n";
    my $self = shift;
    my($value, $name, $type, $attr) = @_;

    my $description=SOAP::Data->new(name=>'description', 
value=>$value->{description}, type=>'string');
    my $sum=SOAP::Data->new(name=>'sum', value=>$value->{sum}, type=>'int');
    my $rval=[$name, {'xsi:type'=>'ns1:sample_Descriptor', %$attr}, 
{description=>$description, sum=>$sum}];
    return $rval;
}

When SOAP call happens, the envelope that is generated by SOAP::Lite is:

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope 
xmlns:ns1="http://..." 
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:tns="http://sampleWebServices.wsdl"><soap:Body><executeExpression 
xmlns="sampleServices"><expression 
xsi:type="ns1:sample_SumExpression"><descriptor 
xsi:type="ns1:sample_Descriptor">HASH(0x9c7d55c)</descriptor><a 
xsi:type="xsd:string">900</a><b xsi:type="xsd:string">100</b><dateAdded 
xsi:type="xsd:dateTime">2006-01-23T03:32:03.781Z</dateAdded></expression></executeExpression></soap:Body></soap:Envelope>

So, the Top level object, sample_Expression, gets encoded correctly, but 
the lower level object, sample_Descriptor, is not.
I have also tried using encode_object function of SOAP::Serializer, but 
this resulted in sample_Descriptor being encoded as an array.

I wonder what I am doing wrong or what SOAP::Lite is doing wrong.  
Please help.


More information about the Melbourne-pm mailing list