Blob Blame History Raw

         HOW TO USE SERIALIZATION / DE-SERIALIZATION
		==============================================

   Serialization/deserialization of unsignedByte, unsignedShort,
unsignedInt, boolean and string built-n XML Schema types is now supported.
It is possible to serialize/deserialize structures, static and dynamic
size arrays constructed from these types.

  For example, let us have the following schema:
  <xsd:element name="SAMPLE">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element name="STRING" type="xsd:string"/>
         <xsd:element name="BOOL" type="xsd:boolean"/>
         <xsd:element name="BYTE" type="xsd:unsignedByte"/>
         <xsd:element name="SHORT" type="xsd:unsignedShort"/>
         <xsd:element name="INT" type="xsd:unsignedInt"/>
         <xsd:element name="SHORTS" type="xsd:unsignedShort" minOccurs="3" maxOccurs="3"/>
         <xsd:element name="INTS" type="xsd:unsignedInt" minOccurs="0" maxOccurs="5"/>
         <xsd:element ref="FOO"  maxOccurs="unbounded"/>
       </xsd:sequence>
     </xsd:complexType>
  </xsd:element>
  <xsd:element name="FOO">
     <xsd:complexType>
       <xsd:sequence>
         <xsd:element name="FooSTRING" type="xsd:string"/>
         <xsd:element name="FooINT" type="xsd:unsignedInt"/>
         <xsd:element name="FooBOOL" type="xsd:boolean"/>
       </xsd:sequence>
     </xsd:complexType>
  </xsd:element>


  Each complex element is represented in the C program by 2 objects - target
  structure (TS) definition and type description object (TDO) - the null
  terminated array of type XmlSerializerInfo elements. The following name
  convention exists: TDO for Foo is named Foo_TypeInfo.
  For our example these structures look the following:

   target structures:

   typedef struct {
       XML_TYPE_STR     FooString;
       XML_TYPE_UINT32  FooInt;
       XML_TYPE_BOOL    FooBoolean;
   } Foo;

   typedef struct {
       XML_TYPE_STR     String;
       XML_TYPE_BOOL    Boolean;
       XML_TYPE_UINT8   Byte;
       XML_TYPE_UINT16  Short;
       XML_TYPE_UINT32  Int;
       XML_TYPE_UINT16  Shorts[3];
       XML_TYPE_DYN_ARRAY  Ints;
       XML_TYPE_DYN_ARRAY  Foos;
  } Sample;

  Note, that the field 'Shorts' in Sample is defined as built-in array because
  the number of elements in schema is strictly defined. Elements Ints
  and Foos are defined as dynamic arrays because the number of these elements
 in the document is variable.

  For each TS an TDO is defined. Each TDS is defined by the sequence of
  defines described in wsman-xml-serializer.h. The order of defines in TDO
  must be same as the order of fields in TS.

 SER_START_ITEMS("FOO", Foo)
           // This is the beginning of the description. The first argument is the
           // name of an element in the XML schema, the second one is the name
           // of the TS type.
    SER_STR("FooSTRING", 1),
    SER_UINT32("FooINT", 1),
    SER_BOOL("FooBOOL", 1),
           // These 3 defines are for string, unsignedInt and boolean XML types
           // accordingly. The first argument is the name of an element in the XML
           // schema, the second one is the number of elements.
 SER_END_ITEMS("FOO", Foo);
           // This Define completes the definition. The arguments are same as
           // for SER_START_ITEMS.

  So if we define The TDO for Foo type. It looks like:
      XmlSerializerInfo Foo_TypeInfo[] = {
        ................
      };
  There are some Defines to add XmlSerializerInfo's for basic types XML_TYPE_UINT8,
  XML_TYPE_UINT16, XML_TYPE_UINT32, XML_TYPE_BOOL and XML_TYPE_STR:
      SER_TYPEINFO_UINT8;
      SER_TYPEINFO_UINT16;
      SER_TYPEINFO_UINT32;
      SER_TYPEINFO_BOOL;
      SER_TYPEINFO_STR;
  If you use dymanic arrays of basic types you must define the corespondent
  XmlSerializerInfo before defining TDO including this dynamic array. You will
  refer to these TDOs in SER_DYN_ARRAY define and use the fourth argument for
  these types uint8, uint16, uint32, bool and string as the last argument (see
  below). 

 Let's do the same for the Sample type.

   SER_START_ITEMS(sample)
      SER_STR("STRING", 1),
      SER_BOOL("BOOL", 1),
      SER_UINT8("BYTE", 1),
      SER_UINT16("SHORT", 1),
      SER_UINT32("INT", 1),
      SER_UINT16("SHORTS", 3),
      SER_DYN_ARRAY("INTS", 0, 5, uint32),
           // This dynamic array describes XML element INTS of type unsignedInt
           // with minOccurs=0 and maxOccurs=5.
      SER_DYN_ARRAY("FOOS", 1, 0, Foo),
           // Dynamic array of Foo type elements. maxOccures=0 means
           // "unbounded" in XML schema
   SER_END_ITEMS(sample);


  These objects can be used in ws_serialize() and ws_deserialize() API.

  There are 2 sets of defines SER_IN_* and SER_OUT_*. These defines are used
  if you want to skip the elements while de-serialization(serialization). If
  define SER_INOUT_* is used the element is skipped always.

  If element name is a QName (with name space prefix) the
      SER_NS_*(ns, name, ..) define set must be used.