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
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #ifndef SerializerH
00049 #define SerializerH
00050
00051 #include <zeusbase/System/ZObject.h>
00052 #include <zeusbase/System/ZObjectFactory.h>
00053 #include <zeusbase/System/Interfaces/ISerializableImplHelper.hpp>
00054 #include <zeusbase/System/Interfaces/ISerializable.hpp>
00055 #include <zeusbase/System/ByteArrayOutputStream.h>
00056 #include <zeusbase/System/ByteArray.hpp>
00057
00058 BEGIN_NAMESPACE_Zeus
00059
00060 class IInputStream;
00061 class IOutputStream;
00062 class IXMLDocument;
00063 class TZObjectFactory;
00064
00065
00066 #define CHECK_ATTRIBUTE(stream, value) (stream.readItem() == value)
00067 #define CHECK_INT8(stream) CHECK_ATTRIBUTE(stream, SERIAL_INT8_ID)
00068 #define CHECK_INT16(stream) CHECK_ATTRIBUTE(stream, SERIAL_INT16_ID)
00069 #define CHECK_INT32(stream) CHECK_ATTRIBUTE(stream, SERIAL_INT32_ID)
00070 #define CHECK_INT64(stream) CHECK_ATTRIBUTE(stream, SERIAL_INT64_ID)
00071 #define CHECK_UINT8(stream) CHECK_ATTRIBUTE(stream, SERIAL_UINT8_ID)
00072 #define CHECK_UINT16(stream) CHECK_ATTRIBUTE(stream, SERIAL_UINT16_ID)
00073 #define CHECK_UINT32(stream) CHECK_ATTRIBUTE(stream, SERIAL_UINT32_ID)
00074 #define CHECK_UINT64(stream) CHECK_ATTRIBUTE(stream, SERIAL_UINT64_ID)
00075 #define CHECK_FLOAT32(stream) CHECK_ATTRIBUTE(stream, SERIAL_FLOAT32_ID)
00076 #define CHECK_FLOAT64(stream) CHECK_ATTRIBUTE(stream, SERIAL_FLOAT64_ID)
00077 #define CHECK_BOOL(stream) CHECK_ATTRIBUTE(stream, SERIAL_BOOL_ID)
00078 #define CHECK_STRING(stream) CHECK_ATTRIBUTE(stream, SERIAL_STRING_ID)
00079 #define CHECK_BYTEARRAY(stream) CHECK_ATTRIBUTE(stream, SERIAL_BYTEARRAY_ID)
00080 #define CHECK_OBJECT(stream) CHECK_ATTRIBUTE(stream, SERIAL_OBJECT_ID)
00081 #define CHECK_XMLDOCUMENT(stream) CHECK_ATTRIBUTE(stream, SERIAL_XMLDOCUMENT_ID)
00082
00083
00084 #define CHECK_OBJECTLIST(stream) CHECK_ATTRIBUTE(stream, SERIAL_OBJECTLIST_ID)
00085 #define CHECK_FLOAT64LIST(stream) CHECK_ATTRIBUTE(stream, SERIAL_FLOAT64LIST_ID)
00086
00087
00088 #define CHECK_STRING_STRINGMAP(stream) CHECK_ATTRIBUTE(stream, SERIAL_STRING_STRINGMAP_ID)
00089
00090
00091
00092
00093
00096
00097 zeusbase_class TSerializer : public TZObject
00098 {
00099 public:
00100
00101 static void serializeBool(IOutputStream& rStreamOut, const bool bValue);
00102 static void serializeInt8(IOutputStream& rStreamOut, const Int8 cValue);
00103 static void serializeInt16(IOutputStream& rStreamOut, const Int16 sValue);
00104 static void serializeInt32(IOutputStream& rStreamOut, const Int32 lValue);
00105 static void serializeInt64(IOutputStream& rStreamOut, const Int64 ldValue);
00106 static void serializeUint8(IOutputStream& rStreamOut, const Uint8 ucValue);
00107 static void serializeUint16(IOutputStream& rStreamOut, const Uint16 usValue);
00108 static void serializeUint32(IOutputStream& rStreamOut, const Uint32 ulValue);
00109 static void serializeUint64(IOutputStream& rStreamOut, const Uint64 uldValue);
00110 static void serializeFloat32(IOutputStream& rStreamOut, const Float32 fValue);
00111 static void serializeFloat64(IOutputStream& rStreamOut, const Float64 dValue);
00112 static void serializeString(IOutputStream& rStreamOut, const IString& rString);
00113 static void serializeByteArray(IOutputStream& rStreamOut, const IByteArray& rArray);
00114 static void serializeObject(IOutputStream& rStreamOut, const ISerializable* pObject);
00115 static void serializeXMLDocument(IOutputStream& rStreamOut, const NAMESPACE_Zeus::IXMLDocument* pDocument);
00116
00117
00118 static void serializeObjectList(IOutputStream& rStreamOut, Int iCount);
00119 static void serializeObjectFromList(IOutputStream& rStreamOut, const ISerializable* pObject);
00120 static void serializeFloat64List(IOutputStream& rStreamOut, const IList<Float64>& rList);
00121
00122
00123 static void serializeStringStringMap(IOutputStream& rStreamOut, const IStringMap<TString>& rMap);
00124
00125
00126
00127 static Retval deserializeBool(IInputStream& rStreamIn, bool& rValue);
00128 static Retval deserializeInt8(IInputStream& rStreamIn, Int8& rValue);
00129 static Retval deserializeInt16(IInputStream& rStreamIn, Int16& rValue);
00130 static Retval deserializeInt32(IInputStream& rStreamIn, Int32& rValue);
00131 static Retval deserializeInt64(IInputStream& rStreamIn, Int64& rValue);
00132 static Retval deserializeUint8(IInputStream& rStreamIn, Uint8& rValue);
00133 static Retval deserializeUint16(IInputStream& rStreamIn, Uint16& rValue);
00134 static Retval deserializeUint32(IInputStream& rStreamIn, Uint32& rValue);
00135 static Retval deserializeUint64(IInputStream& rStreamIn, Uint64& rValue);
00136 static Retval deserializeFloat32(IInputStream& rStreamIn, Float32& rValue);
00137 static Retval deserializeFloat64(IInputStream& rStreamIn, Float64& rValue);
00138 static Retval deserializeString(IInputStream& rStreamIn, IString& rString);
00139 static Retval deserializeByteArray(IInputStream& rStreamIn, IByteArray& rArray);
00140 static Retval deserializeObject(IInputStream& rStreamIn, const InterfaceID& rInterfaceID, IZUnknown*& rpObject);
00141 static Retval deserializeXMLDocument(IInputStream& rStreamIn, NAMESPACE_Zeus::IXMLDocument*& rpDocument);
00142
00143
00144 static Retval deserializeObjectFromList(IInputStream& rStreamIn, const InterfaceID& rInterfaceID, IZUnknown*& rpObject);
00145 static Retval deserializeObjectList(IInputStream& rStreamIn, Int& rCount);
00146 static Retval deserializeFloat64List(IInputStream& rStreamIn, IList<Float64>& rList);
00147
00148
00149 static Retval deserializeStringStringMap(IInputStream& rStreamIn, IStringMap<TString>& rMap);
00150
00151 private:
00152 static void serializeObject_internal(IOutputStream& pStreamOut, const ISerializable* pObject, bool bDoWriteID);
00153 static Retval deserializeObject_internal(IInputStream& pStreamIn, const InterfaceID& rInterfaceID, IZUnknown*& rpObject, bool bDoReadID);
00154 };
00155
00156
00157
00160
00161 inline void TSerializer::serializeBool(IOutputStream& rStreamOut, const bool bValue)
00162 {
00163 rStreamOut.writeInt8(SERIAL_BOOL_ID);
00164 rStreamOut.writeBool(bValue);
00165 }
00166
00167
00170
00171 inline void TSerializer::serializeInt8(IOutputStream& rStreamOut, const Int8 cValue)
00172 {
00173 rStreamOut.writeInt8(SERIAL_INT8_ID);
00174 rStreamOut.writeInt8(cValue);
00175 }
00176
00177
00180
00181 inline void TSerializer::serializeInt16(IOutputStream& rStreamOut, const Int16 sValue)
00182 {
00183 rStreamOut.writeInt8(SERIAL_INT16_ID);
00184 rStreamOut.writeInt32(sValue);
00185 }
00186
00187
00190
00191 inline void TSerializer::serializeInt32(IOutputStream& rStreamOut, const Int32 lValue)
00192 {
00193 rStreamOut.writeInt8(SERIAL_INT32_ID);
00194 rStreamOut.writeInt32(lValue);
00195 }
00196
00197
00200
00201 inline void TSerializer::serializeInt64(IOutputStream& rStreamOut, const Int64 ldValue)
00202 {
00203 rStreamOut.writeInt8(SERIAL_INT64_ID);
00204 rStreamOut.writeInt32((Int32)ldValue);
00205 }
00206
00207
00210
00211 inline void TSerializer::serializeUint8(IOutputStream& rStreamOut, const Uint8 ucValue)
00212 {
00213 rStreamOut.writeInt8(SERIAL_UINT8_ID);
00214 rStreamOut.writeInt8(ucValue);
00215 }
00216
00217
00220
00221 inline void TSerializer::serializeUint16(IOutputStream& rStreamOut, const Uint16 usValue)
00222 {
00223 rStreamOut.writeInt8(SERIAL_UINT16_ID);
00224 rStreamOut.writeInt32(usValue);
00225 }
00226
00227
00230
00231 inline void TSerializer::serializeUint32(IOutputStream& rStreamOut, const Uint32 ulValue)
00232 {
00233 rStreamOut.writeInt8(SERIAL_UINT32_ID);
00234 rStreamOut.writeInt32(ulValue);
00235 }
00236
00237
00240
00241 inline void TSerializer::serializeUint64(IOutputStream& rStreamOut, const Uint64 uldValue)
00242 {
00243 rStreamOut.writeInt8(SERIAL_UINT64_ID);
00244 rStreamOut.writeInt32((Uint32)uldValue);
00245 }
00246
00247
00250
00251 inline void TSerializer::serializeFloat32(IOutputStream& rStreamOut, const Float32 fValue)
00252 {
00253 rStreamOut.writeInt8(SERIAL_FLOAT32_ID);
00254 rStreamOut.writeFloat64(fValue);
00255 }
00256
00257
00260
00261 inline void TSerializer::serializeFloat64(IOutputStream& rStreamOut, const Float64 dValue)
00262 {
00263 rStreamOut.writeInt8(SERIAL_FLOAT64_ID);
00264 rStreamOut.writeFloat64(dValue);
00265 }
00266
00267
00270
00271 inline void TSerializer::serializeString(IOutputStream& rStreamOut, const IString& rString)
00272 {
00273 rStreamOut.writeInt8(SERIAL_STRING_ID);
00274 rStreamOut.writeString(rString);
00275 }
00276
00277
00280
00281 inline void TSerializer::serializeByteArray(IOutputStream& rStreamOut, const IByteArray& rArray)
00282 {
00283 rStreamOut.writeInt8(SERIAL_BYTEARRAY_ID);
00284 rStreamOut.writeArray(rArray);
00285 }
00286
00287
00288
00289
00290
00291 inline void TSerializer::serializeObject(IOutputStream& rStreamOut, const ISerializable* pObject)
00292 {
00293 serializeObject_internal(rStreamOut, pObject, true);
00294 }
00295
00296
00297
00300
00301 inline void TSerializer::serializeObjectList(IOutputStream& rStreamOut, Int iCount)
00302 {
00303 rStreamOut.writeInt8(SERIAL_OBJECTLIST_ID);
00304 rStreamOut.writeInt32(iCount);
00305 }
00306
00307
00310
00311 inline void TSerializer::serializeObjectFromList(IOutputStream& rStreamOut, const ISerializable* pObject)
00312 {
00313 serializeObject_internal(rStreamOut, pObject, false);
00314 }
00315
00316
00321
00322 inline Retval TSerializer::deserializeBool(IInputStream& rStreamIn, bool& rValue)
00323 {
00324 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00325 if (CHECK_BOOL(rStreamIn))
00326 {
00327 rValue = rStreamIn.readBool(NULL);
00328 retValue = RET_NOERROR;
00329 }
00330 return retValue;
00331 }
00332
00333
00338
00339 inline Retval TSerializer::deserializeInt8(IInputStream& rStreamIn, Int8& rValue)
00340 {
00341 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00342 if (CHECK_INT8(rStreamIn))
00343 {
00344 rValue = rStreamIn.readInt8(NULL);
00345 retValue = RET_NOERROR;
00346 }
00347 return retValue;
00348 }
00349
00350
00355
00356 inline Retval TSerializer::deserializeInt16(IInputStream& rStreamIn, Int16& rValue)
00357 {
00358 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00359 if (CHECK_INT16(rStreamIn))
00360 {
00361 rValue = (Int16)rStreamIn.readInt32(NULL);
00362 retValue = RET_NOERROR;
00363 }
00364 return retValue;
00365 }
00366
00367
00372
00373 inline Retval TSerializer::deserializeInt32(IInputStream& rStreamIn, Int32& rValue)
00374 {
00375 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00376 if (CHECK_INT32(rStreamIn))
00377 {
00378 rValue = rStreamIn.readInt32(NULL);
00379 retValue = RET_NOERROR;
00380 }
00381 return retValue;
00382 }
00383
00384
00389
00390 inline Retval TSerializer::deserializeInt64(IInputStream& rStreamIn, Int64& rValue)
00391 {
00392 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00393 if (CHECK_INT64(rStreamIn))
00394 {
00395 rValue = rStreamIn.readInt32(NULL);
00396 retValue = RET_NOERROR;
00397 }
00398 return retValue;
00399 }
00400
00401
00406
00407 inline Retval TSerializer::deserializeUint8(IInputStream& rStreamIn, Uint8& rValue)
00408 {
00409 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00410 if (CHECK_UINT8(rStreamIn))
00411 {
00412 rValue = rStreamIn.readInt8(NULL);
00413 retValue = RET_NOERROR;
00414 }
00415 return retValue;
00416 }
00417
00418
00423
00424 inline Retval TSerializer::deserializeUint16(IInputStream& rStreamIn, Uint16& rValue)
00425 {
00426 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00427 if (CHECK_UINT16(rStreamIn))
00428 {
00429 rValue = (Int16)rStreamIn.readInt32(NULL);
00430 retValue = RET_NOERROR;
00431 }
00432 return retValue;
00433 }
00434
00435
00440
00441 inline Retval TSerializer::deserializeUint32(IInputStream& rStreamIn, Uint32& rValue)
00442 {
00443 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00444 if (CHECK_UINT32(rStreamIn))
00445 {
00446 rValue = rStreamIn.readInt32(NULL);
00447 retValue = RET_NOERROR;
00448 }
00449 return retValue;
00450 }
00451
00452
00457
00458 inline Retval TSerializer::deserializeUint64(IInputStream& rStreamIn, Uint64& rValue)
00459 {
00460 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00461 if (CHECK_UINT64(rStreamIn))
00462 {
00463 rValue = rStreamIn.readInt32(NULL);
00464 retValue = RET_NOERROR;
00465 }
00466 return retValue;
00467 }
00468
00469
00474
00475 inline Retval TSerializer::deserializeFloat32(IInputStream& rStreamIn, Float32& rValue)
00476 {
00477 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00478 if (CHECK_FLOAT32(rStreamIn))
00479 {
00480 rValue = (Float32) rStreamIn.readFloat64(NULL);
00481 retValue = RET_NOERROR;
00482 }
00483 return retValue;
00484 }
00485
00486
00491
00492 inline Retval TSerializer::deserializeFloat64(IInputStream& rStreamIn, Float64& rValue)
00493 {
00494 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00495 if (CHECK_FLOAT64(rStreamIn))
00496 {
00497 rValue = rStreamIn.readFloat64(NULL);
00498 retValue = RET_NOERROR;
00499 }
00500 return retValue;
00501 }
00502
00503
00508
00509 inline Retval TSerializer::deserializeString(IInputStream& rStreamIn, IString& rString)
00510 {
00511 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00512 if (CHECK_STRING(rStreamIn) && rStreamIn.readString(rString) == RET_NOERROR)
00513 {
00514 retValue = RET_NOERROR;
00515 }
00516 return retValue;
00517 }
00518
00519
00524
00525 inline Retval TSerializer::deserializeByteArray(IInputStream& rStreamIn, IByteArray& rArray)
00526 {
00527 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00528 if (CHECK_BYTEARRAY(rStreamIn) && rStreamIn.readArray(rArray) == RET_NOERROR)
00529 {
00530 retValue = RET_NOERROR;
00531 }
00532 return retValue;
00533 }
00534
00535
00536
00541
00542 inline Retval TSerializer::deserializeObject(IInputStream& rStreamIn, const InterfaceID& rInterfaceID, IZUnknown*& rpObject)
00543 {
00544 return deserializeObject_internal(rStreamIn, rInterfaceID, rpObject, true);
00545 }
00546
00547
00552
00553 inline Retval TSerializer::deserializeObjectFromList(IInputStream& rStreamIn, const InterfaceID& rInterfaceID, IZUnknown*& rpObject)
00554 {
00555 return deserializeObject_internal(rStreamIn, rInterfaceID, rpObject, false);
00556 }
00557
00558
00563
00564 inline Retval TSerializer::deserializeObjectList(IInputStream& rStreamIn, Int& rCount)
00565 {
00566 Retval retValue = RET_SERIALIZEPARSING_FAILED;
00567 if (CHECK_OBJECTLIST(rStreamIn))
00568 {
00569 bool bError = false;
00570 rCount = rStreamIn.readInt32(&bError);
00571 if (!bError)
00572 {
00573 retValue = RET_NOERROR;
00574 }
00575 }
00576 return retValue;
00577 }
00578
00579
00580 END_NAMESPACE_Zeus
00581
00582 #endif