00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef SerializerH
00033 #define SerializerH
00034
00035 #include <zeusbase/System/ZObject.h>
00036 #include <zeusbase/System/ZObjectFactory.h>
00037 #include <zeusbase/System/Interfaces/ISerializableImplHelper.hpp>
00038 #include <zeusbase/System/Interfaces/ISerializable.hpp>
00039 #include <zeusbase/System/Interfaces/IStringList.hpp>
00040 #include <zeusbase/System/ByteArrayOutputStream.h>
00041 #include <zeusbase/System/ByteArray.hpp>
00042
00043 BEGIN_NAMESPACE_Zeus
00044
00045 class IInputStream;
00046 class IOutputStream;
00047 class TZObjectFactory;
00048
00049 #if defined(ENABLE_XML_BINDING)
00050 class IXMLDocument;
00051 #endif
00052
00053 #define CHECK_ATTRIBUTE(stream, value) (stream.readItem() == value)
00054 #define CHECK_INT8(stream) CHECK_ATTRIBUTE(stream, SERIAL_INT8_ID)
00055 #define CHECK_INT16(stream) CHECK_ATTRIBUTE(stream, SERIAL_INT16_ID)
00056 #define CHECK_INT32(stream) CHECK_ATTRIBUTE(stream, SERIAL_INT32_ID)
00057 #define CHECK_INT64(stream) CHECK_ATTRIBUTE(stream, SERIAL_INT64_ID)
00058 #define CHECK_UINT8(stream) CHECK_ATTRIBUTE(stream, SERIAL_UINT8_ID)
00059 #define CHECK_UINT16(stream) CHECK_ATTRIBUTE(stream, SERIAL_UINT16_ID)
00060 #define CHECK_UINT32(stream) CHECK_ATTRIBUTE(stream, SERIAL_UINT32_ID)
00061 #define CHECK_UINT64(stream) CHECK_ATTRIBUTE(stream, SERIAL_UINT64_ID)
00062 #define CHECK_FLOAT32(stream) CHECK_ATTRIBUTE(stream, SERIAL_FLOAT32_ID)
00063 #define CHECK_FLOAT64(stream) CHECK_ATTRIBUTE(stream, SERIAL_FLOAT64_ID)
00064 #define CHECK_BOOL(stream) CHECK_ATTRIBUTE(stream, SERIAL_BOOL_ID)
00065 #define CHECK_STRING(stream) CHECK_ATTRIBUTE(stream, SERIAL_STRING_ID)
00066 #define CHECK_BYTEARRAY(stream) CHECK_ATTRIBUTE(stream, SERIAL_BYTEARRAY_ID)
00067 #define CHECK_OBJECT(stream) CHECK_ATTRIBUTE(stream, SERIAL_OBJECT_ID)
00068 #define CHECK_GUID(stream) CHECK_ATTRIBUTE(stream, SERIAL_GUID_ID)
00069
00070 #if defined(ENABLE_XML_BINDING)
00071 #define CHECK_XMLDOCUMENT(stream) CHECK_ATTRIBUTE(stream, SERIAL_XMLDOCUMENT_ID)
00072 #endif
00073
00074
00075 #define CHECK_COLLECTION(stream, id) CHECK_ATTRIBUTE(stream, id)
00076
00077 #define CHECK_OBJECTLIST(stream) CHECK_COLLECTION(stream, SERIAL_OBJECTLIST_ID)
00078 #define CHECK_FLOAT64LIST(stream) CHECK_ATTRIBUTE(stream, SERIAL_FLOAT64LIST_ID)
00079 #define CHECK_STRINGLIST(stream) CHECK_ATTRIBUTE(stream, SERIAL_STRINGLIST_ID)
00080 #define CHECK_GUIDLIST(stream) CHECK_ATTRIBUTE(stream, SERIAL_GUIDLIST_ID)
00081 #define CHECK_UINT32LIST(stream) CHECK_ATTRIBUTE(stream, SERIAL_UINT32LIST_ID)
00082
00083
00084 #define CHECK_STRING_STRINGMAP(stream) CHECK_ATTRIBUTE(stream, SERIAL_STRING_STRINGMAP_ID)
00085 #define CHECK_OBJECT_GUIDMAP(stream) CHECK_COLLECTION(stream, SERIAL_OBJECT_GUIDMAP_ID)
00086
00087
00088
00089
00092
00093 zeusbase_class TSerializer : public TZObject
00094 {
00095 public:
00096
00097 static void serializeBool(IOutputStream& rStreamOut, const bool bValue);
00098 static void serializeInt8(IOutputStream& rStreamOut, const Int8 cValue);
00099 static void serializeInt16(IOutputStream& rStreamOut, const Int16 sValue);
00100 static void serializeInt32(IOutputStream& rStreamOut, const Int32 lValue);
00101 static void serializeInt64(IOutputStream& rStreamOut, const Int64 ldValue);
00102 static void serializeUint8(IOutputStream& rStreamOut, const Uint8 ucValue);
00103 static void serializeUint16(IOutputStream& rStreamOut, const Uint16 usValue);
00104 static void serializeUint32(IOutputStream& rStreamOut, const Uint32 ulValue);
00105 static void serializeUint64(IOutputStream& rStreamOut, const Uint64 uldValue);
00106 static void serializeFloat32(IOutputStream& rStreamOut, const Float32 fValue);
00107 static void serializeFloat64(IOutputStream& rStreamOut, const Float64 dValue);
00108 static void serializeString(IOutputStream& rStreamOut, const IString& rString);
00109 static void serializeByteArray(IOutputStream& rStreamOut, const IByteArray& rArray);
00110 static void serializeObject(IOutputStream& rStreamOut, const ISerializable* pObject);
00111 #if defined(ENABLE_XML_BINDING)
00112 static void serializeXMLDocument(IOutputStream& rStreamOut, const NAMESPACE_Zeus::IXMLDocument* pDocument);
00113 #endif
00114 static void serializeGUID(IOutputStream& rStreamOut, const TypGUID& rValue);
00115
00116
00117 static void serializeCollectionCount(IOutputStream& rStreamOut, Int iClassID, Int iCount);
00118 static void serializeGUIDFromCollection(IOutputStream& rStreamOut, const TypGUID& rValue);
00119 static void serializeObjectFromCollection(IOutputStream& rStreamOut, const ISerializable* pObject);
00120 static void serializeFloat64List(IOutputStream& rStreamOut, const IList<Float64>& rList);
00121 static void serializeStringList(IOutputStream& rStreamOut, const IStringList& rList);
00122 static void serializeGUIDList(IOutputStream& rStreamOut, const IList<TypGUID>& rList);
00123 static void serializeUint32List(IOutputStream& rStreamOut, const IList<Uint32>& rList);
00124
00125
00126 static void serializeStringStringMap(IOutputStream& rStreamOut, const IStringMap<TString>& rMap);
00127
00128
00129
00130 static Retval deserializeBool(IInputStream& rStreamIn, bool& rValue);
00131 static Retval deserializeInt8(IInputStream& rStreamIn, Int8& rValue);
00132 static Retval deserializeInt16(IInputStream& rStreamIn, Int16& rValue);
00133 static Retval deserializeInt32(IInputStream& rStreamIn, Int32& rValue);
00134 static Retval deserializeInt64(IInputStream& rStreamIn, Int64& rValue);
00135 static Retval deserializeUint8(IInputStream& rStreamIn, Uint8& rValue);
00136 static Retval deserializeUint16(IInputStream& rStreamIn, Uint16& rValue);
00137 static Retval deserializeUint32(IInputStream& rStreamIn, Uint32& rValue);
00138 static Retval deserializeUint64(IInputStream& rStreamIn, Uint64& rValue);
00139 static Retval deserializeFloat32(IInputStream& rStreamIn, Float32& rValue);
00140 static Retval deserializeFloat64(IInputStream& rStreamIn, Float64& rValue);
00141 static Retval deserializeString(IInputStream& rStreamIn, IString& rString);
00142 static Retval deserializeByteArray(IInputStream& rStreamIn, IByteArray& rArray);
00143 static Retval deserializeObject(IInputStream& rStreamIn, const InterfaceID& rInterfaceID, IZUnknown*& rpObject);
00144 #if defined(ENABLE_XML_BINDING)
00145 static Retval deserializeXMLDocument(IInputStream& rStreamIn, NAMESPACE_Zeus::IXMLDocument*& rpDocument);
00146 #endif
00147 static Retval deserializeGUID(IInputStream& rStreamIn, TypGUID& rValue);
00148
00149
00150 static Retval deserializeGUIDFromCollection(IInputStream& rStreamIn, TypGUID& rValue);
00151 static Retval deserializeObjectFromCollection(IInputStream& rStreamIn, const InterfaceID& rInterfaceID, IZUnknown*& rpObject);
00152 static Retval deserializeCollectionCount(IInputStream& rStreamIn, Int iClassID, Int& rCount);
00153 static Retval deserializeFloat64List(IInputStream& rStreamIn, IList<Float64>& rList);
00154 static Retval deserializeStringList(IInputStream& rStreamIn, IStringList& rList);
00155 static Retval deserializeGUIDList(IInputStream& rStreamIn, IList<TypGUID>& rList);
00156 static Retval deserializeUint32List(IInputStream& rStreamIn, IList<Uint32>& rList);
00157
00158
00159 static Retval deserializeStringStringMap(IInputStream& rStreamIn, IStringMap<TString>& rMap);
00160
00161 private:
00162 static void serializeGUID_internal(IOutputStream& rStreamOut, const TypGUID& rValue, bool bDoWriteID);
00163 static void serializeObject_internal(IOutputStream& pStreamOut, const ISerializable* pObject, bool bDoWriteID);
00164
00165 static Retval deserializeGUID_internal(IInputStream& rStreamIn, TypGUID& rValue, bool bDoReadID);
00166 static Retval deserializeObject_internal(IInputStream& pStreamIn, const InterfaceID& rInterfaceID, IZUnknown*& rpObject, bool bDoReadID);
00167 };
00168
00169
00170
00173
00174 inline void TSerializer::serializeBool(IOutputStream& rStreamOut, const bool bValue)
00175 {
00176 rStreamOut.writeInt8(SERIAL_BOOL_ID);
00177 rStreamOut.writeBool(bValue);
00178 }
00179
00180
00183
00184 inline void TSerializer::serializeInt8(IOutputStream& rStreamOut, const Int8 cValue)
00185 {
00186 rStreamOut.writeInt8(SERIAL_INT8_ID);
00187 rStreamOut.writeInt8(cValue);
00188 }
00189
00190
00193
00194 inline void TSerializer::serializeInt16(IOutputStream& rStreamOut, const Int16 sValue)
00195 {
00196 rStreamOut.writeInt8(SERIAL_INT16_ID);
00197 rStreamOut.writeInt32(sValue);
00198 }
00199
00200
00203
00204 inline void TSerializer::serializeInt32(IOutputStream& rStreamOut, const Int32 lValue)
00205 {
00206 rStreamOut.writeInt8(SERIAL_INT32_ID);
00207 rStreamOut.writeInt32(lValue);
00208 }
00209
00210
00213
00214 inline void TSerializer::serializeInt64(IOutputStream& rStreamOut, const Int64 ldValue)
00215 {
00216 rStreamOut.writeInt8(SERIAL_INT64_ID);
00217 rStreamOut.writeInt32((Int32)ldValue);
00218 }
00219
00220
00223
00224 inline void TSerializer::serializeUint8(IOutputStream& rStreamOut, const Uint8 ucValue)
00225 {
00226 rStreamOut.writeInt8(SERIAL_UINT8_ID);
00227 rStreamOut.writeInt8(ucValue);
00228 }
00229
00230
00233
00234 inline void TSerializer::serializeUint16(IOutputStream& rStreamOut, const Uint16 usValue)
00235 {
00236 rStreamOut.writeInt8(SERIAL_UINT16_ID);
00237 rStreamOut.writeInt32(usValue);
00238 }
00239
00240
00243
00244 inline void TSerializer::serializeUint32(IOutputStream& rStreamOut, const Uint32 ulValue)
00245 {
00246 rStreamOut.writeInt8(SERIAL_UINT32_ID);
00247 rStreamOut.writeInt32(ulValue);
00248 }
00249
00250
00253
00254 inline void TSerializer::serializeUint64(IOutputStream& rStreamOut, const Uint64 uldValue)
00255 {
00256 rStreamOut.writeInt8(SERIAL_UINT64_ID);
00257 rStreamOut.writeInt32((Uint32)uldValue);
00258 }
00259
00260
00263
00264 inline void TSerializer::serializeFloat32(IOutputStream& rStreamOut, const Float32 fValue)
00265 {
00266 rStreamOut.writeInt8(SERIAL_FLOAT32_ID);
00267 rStreamOut.writeFloat64(fValue);
00268 }
00269
00270
00273
00274 inline void TSerializer::serializeFloat64(IOutputStream& rStreamOut, const Float64 dValue)
00275 {
00276 rStreamOut.writeInt8(SERIAL_FLOAT64_ID);
00277 rStreamOut.writeFloat64(dValue);
00278 }
00279
00280
00283
00284 inline void TSerializer::serializeString(IOutputStream& rStreamOut, const IString& rString)
00285 {
00286 rStreamOut.writeInt8(SERIAL_STRING_ID);
00287 rStreamOut.writeString(rString);
00288 }
00289
00290
00293
00294 inline void TSerializer::serializeByteArray(IOutputStream& rStreamOut, const IByteArray& rArray)
00295 {
00296 rStreamOut.writeInt8(SERIAL_BYTEARRAY_ID);
00297 rStreamOut.writeArray(rArray);
00298 }
00299
00300
00303
00304 inline void TSerializer::serializeGUID(IOutputStream& rStreamOut, const TypGUID& rValue)
00305 {
00306 serializeGUID_internal(rStreamOut, rValue, true);
00307 }
00308
00309
00310
00311
00312
00313 inline void TSerializer::serializeObject(IOutputStream& rStreamOut, const ISerializable* pObject)
00314 {
00315 serializeObject_internal(rStreamOut, pObject, true);
00316 }
00317
00318
00319
00322
00323 inline void TSerializer::serializeCollectionCount(IOutputStream& rStreamOut, Int iClassID, Int iCount)
00324 {
00325 rStreamOut.writeInt8((Int8)iClassID);
00326 rStreamOut.writeInt32(iCount);
00327 }
00328
00329
00332
00333 inline void TSerializer::serializeGUIDFromCollection(IOutputStream& rStreamOut, const TypGUID& rValue)
00334 {
00335 serializeGUID_internal(rStreamOut, rValue, false);
00336 }
00337
00338
00341
00342 inline void TSerializer::serializeObjectFromCollection(IOutputStream& rStreamOut, const ISerializable* pObject)
00343 {
00344 serializeObject_internal(rStreamOut, pObject, false);
00345 }
00346
00347
00352
00353 inline Retval TSerializer::deserializeBool(IInputStream& rStreamIn, bool& rValue)
00354 {
00355 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00356 if (CHECK_BOOL(rStreamIn))
00357 {
00358 rValue = rStreamIn.readBool(NULL);
00359 retValue = RET_NOERROR;
00360 }
00361 return retValue;
00362 }
00363
00364
00369
00370 inline Retval TSerializer::deserializeInt8(IInputStream& rStreamIn, Int8& rValue)
00371 {
00372 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00373 if (CHECK_INT8(rStreamIn))
00374 {
00375 rValue = rStreamIn.readInt8(NULL);
00376 retValue = RET_NOERROR;
00377 }
00378 return retValue;
00379 }
00380
00381
00386
00387 inline Retval TSerializer::deserializeInt16(IInputStream& rStreamIn, Int16& rValue)
00388 {
00389 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00390 if (CHECK_INT16(rStreamIn))
00391 {
00392 rValue = (Int16)rStreamIn.readInt32(NULL);
00393 retValue = RET_NOERROR;
00394 }
00395 return retValue;
00396 }
00397
00398
00403
00404 inline Retval TSerializer::deserializeInt32(IInputStream& rStreamIn, Int32& rValue)
00405 {
00406 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00407 if (CHECK_INT32(rStreamIn))
00408 {
00409 rValue = rStreamIn.readInt32(NULL);
00410 retValue = RET_NOERROR;
00411 }
00412 return retValue;
00413 }
00414
00415
00420
00421 inline Retval TSerializer::deserializeInt64(IInputStream& rStreamIn, Int64& rValue)
00422 {
00423 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00424 if (CHECK_INT64(rStreamIn))
00425 {
00426 rValue = rStreamIn.readInt32(NULL);
00427 retValue = RET_NOERROR;
00428 }
00429 return retValue;
00430 }
00431
00432
00437
00438 inline Retval TSerializer::deserializeUint8(IInputStream& rStreamIn, Uint8& rValue)
00439 {
00440 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00441 if (CHECK_UINT8(rStreamIn))
00442 {
00443 rValue = rStreamIn.readInt8(NULL);
00444 retValue = RET_NOERROR;
00445 }
00446 return retValue;
00447 }
00448
00449
00454
00455 inline Retval TSerializer::deserializeUint16(IInputStream& rStreamIn, Uint16& rValue)
00456 {
00457 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00458 if (CHECK_UINT16(rStreamIn))
00459 {
00460 rValue = (Int16)rStreamIn.readInt32(NULL);
00461 retValue = RET_NOERROR;
00462 }
00463 return retValue;
00464 }
00465
00466
00471
00472 inline Retval TSerializer::deserializeUint32(IInputStream& rStreamIn, Uint32& rValue)
00473 {
00474 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00475 if (CHECK_UINT32(rStreamIn))
00476 {
00477 rValue = rStreamIn.readInt32(NULL);
00478 retValue = RET_NOERROR;
00479 }
00480 return retValue;
00481 }
00482
00483
00488
00489 inline Retval TSerializer::deserializeUint64(IInputStream& rStreamIn, Uint64& rValue)
00490 {
00491 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00492 if (CHECK_UINT64(rStreamIn))
00493 {
00494 rValue = rStreamIn.readInt32(NULL);
00495 retValue = RET_NOERROR;
00496 }
00497 return retValue;
00498 }
00499
00500
00505
00506 inline Retval TSerializer::deserializeFloat32(IInputStream& rStreamIn, Float32& rValue)
00507 {
00508 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00509 if (CHECK_FLOAT32(rStreamIn))
00510 {
00511 rValue = (Float32) rStreamIn.readFloat64(NULL);
00512 retValue = RET_NOERROR;
00513 }
00514 return retValue;
00515 }
00516
00517
00522
00523 inline Retval TSerializer::deserializeFloat64(IInputStream& rStreamIn, Float64& rValue)
00524 {
00525 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00526 if (CHECK_FLOAT64(rStreamIn))
00527 {
00528 rValue = rStreamIn.readFloat64(NULL);
00529 retValue = RET_NOERROR;
00530 }
00531 return retValue;
00532 }
00533
00534
00539
00540 inline Retval TSerializer::deserializeString(IInputStream& rStreamIn, IString& rString)
00541 {
00542 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00543 if (CHECK_STRING(rStreamIn) && rStreamIn.readString(rString) == RET_NOERROR)
00544 {
00545 retValue = RET_NOERROR;
00546 }
00547 return retValue;
00548 }
00549
00550
00555
00556 inline Retval TSerializer::deserializeByteArray(IInputStream& rStreamIn, IByteArray& rArray)
00557 {
00558 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00559 if (CHECK_BYTEARRAY(rStreamIn) && rStreamIn.readArray(rArray) == RET_NOERROR)
00560 {
00561 retValue = RET_NOERROR;
00562 }
00563 return retValue;
00564 }
00565
00566
00571
00572 inline Retval TSerializer::deserializeGUID(IInputStream& rStreamIn, TypGUID& rValue)
00573 {
00574 return deserializeGUID_internal(rStreamIn, rValue, true);
00575 }
00576
00577
00582
00583 inline Retval TSerializer::deserializeObject(IInputStream& rStreamIn, const InterfaceID& rInterfaceID, IZUnknown*& rpObject)
00584 {
00585 return deserializeObject_internal(rStreamIn, rInterfaceID, rpObject, true);
00586 }
00587
00588
00593
00594 inline Retval TSerializer::deserializeGUIDFromCollection(IInputStream& rStreamIn, TypGUID& rValue)
00595 {
00596 return deserializeGUID_internal(rStreamIn, rValue, false);
00597 }
00598
00599
00604
00605 inline Retval TSerializer::deserializeObjectFromCollection(IInputStream& rStreamIn, const InterfaceID& rInterfaceID, IZUnknown*& rpObject)
00606 {
00607 return deserializeObject_internal(rStreamIn, rInterfaceID, rpObject, false);
00608 }
00609
00610
00615
00616 inline Retval TSerializer::deserializeCollectionCount(IInputStream& rStreamIn, Int iClassID, Int& rCount)
00617 {
00618 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00619 if (CHECK_COLLECTION(rStreamIn, iClassID))
00620 {
00621 bool bError = false;
00622 rCount = rStreamIn.readInt32(&bError);
00623 if (!bError)
00624 {
00625 retValue = RET_NOERROR;
00626 }
00627 }
00628 return retValue;
00629 }
00630
00631
00632 END_NAMESPACE_Zeus
00633
00634 #endif