[Melbourne-pm] SOAP::Lite Serializing Complex objects.
Mathew Robertson
mathew.robertson at netratings.com.au
Mon Jan 23 17:09:19 PST 2006
Hi there,
I haven't used SOAP::Lite, but I had a quite look at the module code ->
it appears that you shouldn't be using 'ns1' as a prefix.
Not sure if this helps,
Mathew
Daniel Golembo wrote:
>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.
>_______________________________________________
>Melbourne-pm mailing list
>Melbourne-pm at pm.org
>http://mail.pm.org/mailman/listinfo/melbourne-pm
>
>
More information about the Melbourne-pm
mailing list