| |
| 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. |