Provided by: libsoap-lite-perl_1.27-3_all bug

NAME

       SOAP::Serializer - the means by which the toolkit manages the expression of data as XML

DESCRIPTION

       The SOAP::Serializer class is the means by which the toolkit manages the expression of data as XML. The
       object that a SOAP::Lite instance uses by default is generally enough for the task, with no need for the
       application to create its own. The main purpose of this class is to provide a place for applications to
       extend the serializer by defining additional methods for handling new datatypes.

METHODS

       new(optional key/value pairs)
               $serialize = SOAP::Serializer->new( );

           This is the constructor method for the class. In addition to creating a basic object and initializing
           it  with  default  values,  the  constructor  can also take names and values for most of the accessor
           methods that the class supports.

       envelope(method, data arguments)
               $serialize->envelope(fault => $fault_obj);

           Provides the core purpose for the SOAP::Serializer class. It creates the full SOAP envelope based  on
           the  input  passed  in  to  it. The data arguments passed in the list of parameters to the method are
           divided into two sublists: any parameters that are SOAP::Header objects or derivatives of go into one
           list, while the remainder go into the other. The nonheader objects are used as the  content  for  the
           message  body, with the body itself being largely dependent on the value of the first argument in the
           list. This argument is expected to be a string and should be one of the following:

       context
               $serialize->context->packager();

           This provides access to the calling context of "SOAP::Serializer". In a client side context the often
           means a reference to an instance of SOAP::Lite. In a server side context this means a reference to  a
           SOAP::Server instance.

           method
               The envelope is being created to encapsulate a RPC-style method call.

           response
               The message being created is that of a response stemming from a RPC-style method call.

           fault
               For this specifier, the envelope being created is to transmit a fault.

           freeform
               This  identifier is used as a general-case encoding style for messages that don't fit into any of
               the previous cases. The arguments are encoded into the envelope's Body tag without  any  sort  of
               context sensitivity.

           Any value other than these four results in an error.

       envprefix(optional value)
               $serialize->envprefix('env');

           Gets or sets the prefix that labels the SOAP envelope namespace. This defaults to SOAP-ENV.

       encprefix(optional value)
               $serialize->envprefix('enc');

           Gets or sets the prefix that labels the SOAP encoding namespace. Defaults to SOAP-ENC.

       soapversion(optional value)
               $serialize->soapversion('1.2');

           If  no  parameter  is  given, returns the current version of SOAP that is being used as the basis for
           serializing messages. If a parameter is given, attempts to set that as  the  version  of  SOAP  being
           used.  The value should be either 1.1 or 1.2. When the SOAP version is being set, the package selects
           new URNs for envelope and encoding spaces and also calls the xmlschema method to set the  appropriate
           schema definition.

       xmlschema(optional value)
               $serialize->xmlschema($xml_schema_1999);

           Gets  or  sets the URN for the schema being used to express the structure of the XML generated by the
           serializer. If setting the value, the input must be the full URN for the new schema  and  is  checked
           against the list of known SOAP schemas.

       register_ns
           The  register_ns  subroutine  allows users to register a global namespace with the SOAP Envelope. The
           first parameter is the namespace, the second parameter to this subroutine is an optional prefix. If a
           prefix is not provided, one will be generated automatically for you. All namespaces  registered  with
           the serializer get declared in the <soap:Envelope /> element.

       find_prefix
           The  find_prefix  subroutine takes a namespace as a parameter and returns the assigned prefix to that
           namespace. This eliminates the need to declare and redeclare  namespaces  within  an  envelope.  This
           subroutine  is  especially  helpful  in  determining  the  proper  prefix  when assigning a type to a
           SOAP::Data element. A good example of how this might be used is as follows:

               SOAP::Data->name("foo" => $inputParams{'foo'})
                  ->type($client->serializer->find_prefix('urn:Foo').':Foo');

CUSTOM DATA TYPES

       When serializing an object, or blessed hash reference, into XML, "SOAP::Serializer" first checks  to  see
       if  a  subroutine  has  been  defined  for  the corresponding class name. For example, in the code below,
       "SOAP::Serializer" will check to see if a subroutine called "as_MyModule__MyPackage" has been defined. If
       so, then it will pass $foo to that subroutine along with other data known about the "SOAP::Data"  element
       being encoded.

          $foo = MyModule::MyPackage->new;
          my $client = SOAP::Lite
             ->uri($NS)
             ->proxy($HOST);
          $som = $client->someMethod(SOAP::Data->name("foo" => $foo));

as_TypeName SUBROUTINE REQUIREMENTS

       Naming Convention
           The  subroutine  should  always  be prepended with "as_" followed by the type's name. The type's name
           must have all colons (':') substituted with an underscore ('_').

       Input
           The input to "as_TypeName" will have at least one parameter, and at most four parameters.  The  first
           parameter will always be the value or the object to be encoded. The following three parameters depend
           upon the context of the value/object being encoded.

           If  the  value/object being encoded was part of a "SOAP::Data" object (as in the above example), then
           the second, third and fourth parameter will be the "SOAP::Data" element's name, type,  and  attribute
           set  respectively. If on the other hand, the value/object being encoded is not part of a "SOAP::Data"
           object, as in the code below:

              $foo = MyModule::MyPackage->new;
              my $client = SOAP::Lite
                 ->uri($NS)
                 ->proxy($HOST);
              $som = $client->someMethod($foo);

           Then the second and third parameters will be the class name of the value/object being  encoded  (e.g.
           "MyModule::MyPackage" in the example above), and the fourth parameter will be an empty hash.

       Output
           The  encoding  subroutine  must  return  an  array  containing three elements: 1) the name of the XML
           element, 2) a hash containing the attributes to be placed into the element, and 3) the value  of  the
           element.

AUTOTYPING

       When  the  type  of  an element has not been declared explicitly, SOAP::Lite must "guess" at the object's
       type. That is due to the fact that the only form of introspection that Perl provides (through the use  of
       the  "ref"  subroutine)  does not provide enough information to "SOAP::Serializer" to allow SOAP::Lite to
       determine the exact type of an element being serialized.

       To work around this limitation,  the  "SOAP::Serializer::typelookup"  hash  was  created.  This  hash  is
       populated  with  all  the  data  types  that  the  current  "SOAP::Serializer" can auto detect. Users and
       developers are free to modify the contents of this hash allowing them to register new data types with the
       system.

       When "SOAP::Serializer" is asked to encode an object into XML,  it  goes  through  the  following  steps.
       First, "SOAP::Serializer" checks to see if a type has been explicitly stated for the current object. If a
       type  has  been  provided "SOAP::Serializer" checks to see if an "as_TypeName" subroutine as been defined
       for that type. If such a subroutine exists, then  "SOAP::Serializer"  passes  the  object  to  it  to  be
       encoded.  If  the  subroutine  does not exist, or the type has not been provided, then "SOAP::Serializer"
       must attempt to "guess" the type of the object being serialized.

       To do so, "SOAP::Serializer" runs in sequence a set of tests stored in the "SOAP::Serializer::typelookup"
       hash. "SOAP::Serializer" continues to run each test until one of the tests returns true, indicating  that
       the  type  of  the  object  has  been  detected.  When  the  type  of  the object has been detected, then
       "SOAP::Serializer" passes the object to the encoding subroutine that corresponds with the test  that  was
       passed.  If  all  the tests fail, and the type was not determined, then "SOAP::Serializer" will as a last
       resort encode the object based on one of the four basic data types known to Perl: REF, SCALAR, ARRAY  and
       HASH.

       The following table contains the set of data types detectable by "SOAP::Lite" by default and the order in
       which their corresponding test subroutine will be run, according to their precedence value.

         Table 1 - Autotyping Precedence

         TYPENAME    PRECEDENCE VALUE
         ----------------------------
         base64      10
         int         20
         long        25
         float       30
         gMonth      35
         gDay        40
         gYear       45
         gMonthDay   50
         gYearMonth  55
         date        60
         time        70
         dateTime    75
         duration    80
         boolean     90
         anyURI      95
         string      100

   REGISTERING A NEW DATA TYPE
       To  register  a new data type that can be automatically detected by "SOAP::Lite" and then serialized into
       XML, the developer must provide the following four things:

       •   The name of the new data type.

       •   A subroutine that is capable of detecting whether a value passed to it is of the  corresponding  data
           type.

       •   A  number  representing  the  test  subroutine's  precedence  relative  to  all the other types' test
           subroutinestypes. See Table 1 - Autotyping Precedence.

       •   A subroutine that is capable of  providing  "SOAP::Serializer"  with  the  information  necessary  to
           serialize an object of the corresponding data type into XML.

       EXAMPLE 1

       If,  for  example,  you wish to create a new datatype called "uriReference" for which you would like Perl
       values to be automatically detected and serialized into, then you follow these steps.

       Step 1: Write a Test Subroutine

       The test subroutine will have passed to  it  by  "SOAP::Serializer"  a  value  to  be  tested.  The  test
       subroutine  must  return 1 if the value passed to it is of the corresponding type, or else it must return
       0.

           sub SOAP::Serializer::uriReferenceTest {
             my ($value) = @_;
             return 1 if ($value =~ m!^http://!);
             return 0;
           }

       Step 2: Write an Encoding Subroutine

       The encoding subroutine provides "SOAP::Serializer" with the data necessary to encode the value passed to
       it into XML. The encoding subroutine name's should be of the following format: "as_"<Type Name>.

       The encoding subroutine will have passed to it by "SOAP::Serializer" four parameters:  the  value  to  be
       encoded,  the  name  of  the  element being encoded, the assumed type of the element being encoded, and a
       reference to a hash containing the attributes of the element being encoded. The encoding subroutine  must
       return an array representing the encoded datatype. "SOAP::Serializer" will use the contents of this array
       to  generate  the  corresponding  XML  of the value being encoded, or serialized. This array contains the
       following 3 elements: the name of the XML element, a hash containing the attributes to be placed into the
       element, and the value of the element.

         sub SOAP::Serializer::as_uriReference {
           my $self = shift;
           my($value, $name, $type, $attr) = @_;
           return [$name, {'xsi:type' => 'xsd:uriReference', %$attr}, $value];
         }

       Step 3: Register the New Data Type

       To register the new data type, simply add the type to the "SOAP::Serializer::typelookup" hash  using  the
       type name as the key, and an array containing the precedence value, the test subroutine, and the encoding
       subroutine.

         $s->typelookup->{uriReference}
             = [11, \&uriReferenceTest, 'as_uriReference'];

       Tip:  As a short hand, you could just as easily use an anonymous test subroutine when registering the new
       datatype in place of the "urlReferenceTest" subroutine above. For example:

         $s->typelookup->{uriReference}
             = [11, sub { $_[0] =~ m!^http://! }, 'as_uriReference'];

       Once complete, "SOAP::Serializer" will be able to serialize the following "SOAP::Data" object into XML:

         $elem = SOAP::Data->name("someUri" => 'http://yahoo.com')->type('uriReference');

       "SOAP::Serializer" will also be able to automatically  determine  and  serialize  the  following  untyped
       "SOAP::Data" object into XML:

         $elem = SOAP::Data->name("someUri" => 'http://yahoo.com');

ACKNOWLEDGEMENTS

       Special  thanks  to  O'Reilly  publishing  which  has  graciously  allowed  SOAP::Lite  to  republish and
       redistribute large excerpts from Programming Web Services with  Perl,  mainly  the  SOAP::Lite  reference
       found in Appendix B.

COPYRIGHT

       Copyright (C) 2000-2004 Paul Kulchenko. All rights reserved.

       This  library  is  free  software;  you can redistribute it and/or modify it under the same terms as Perl
       itself.

AUTHORS

       Paul Kulchenko (paulclinger@yahoo.com)

       Randy J. Ray (rjray@blackperl.com)

       Byrne Reese (byrne@majordojo.com)

perl v5.36.0                                       2023-03-01                              SOAP::Serializer(3pm)