diff --git a/src/xercesc/util/XMLAbstractDoubleFloat.cpp b/src/xercesc/util/XMLAbstractDoubleFloat.cpp
index 10f51a6bd955b07cf724f1857008ec6155c0f3b5..b1000f24cbeb08c3f6335b495adf4b87e8550716 100644
--- a/src/xercesc/util/XMLAbstractDoubleFloat.cpp
+++ b/src/xercesc/util/XMLAbstractDoubleFloat.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.14  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.13  2003/05/16 06:01:52  knoaman
  * Partial implementation of the configurable memory manager.
  *
@@ -424,4 +427,53 @@ void XMLAbstractDoubleFloat::normalizeZero(XMLCh* const inData)
     return;
 } 
 
+/***
+ * Support for Serialization/De-serialization
+ ***/
+
+IMPL_XSERIALIZABLE_NOCREATE(XMLAbstractDoubleFloat)
+
+void XMLAbstractDoubleFloat::serialize(XSerializeEngine& serEng)
+{
+    //REVISIT: may not need to call base since it does nothing
+    XMLNumber::serialize(serEng);
+
+    if (serEng.isStoring())
+    {
+        serEng << fValue;
+        serEng << fType;
+        serEng << fDataConverted;
+        serEng << fSign;
+
+        int rawDataLen = XMLString::stringLen(fRawData);
+        serEng << rawDataLen;
+        serEng.write(fRawData, rawDataLen);
+
+        // Do not serialize fFormattedString
+
+    }
+    else
+    {
+        serEng >> fValue;
+
+        int type = 0;
+        serEng >> type;
+        fType = (LiteralType) type;
+
+        serEng >> fDataConverted;
+        serEng >> fSign;
+
+        int rawDataLen = 0;
+        serEng >> rawDataLen;
+        fRawData = (XMLCh*) fMemoryManager->allocate(rawDataLen+1);
+        serEng.read(fRawData, rawDataLen);
+        fRawData[rawDataLen] = 0;
+
+        // Set it to 0 force it to re-format if needed
+        fFormattedString = 0;
+
+    }
+
+}
+
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/util/XMLAbstractDoubleFloat.hpp b/src/xercesc/util/XMLAbstractDoubleFloat.hpp
index 248f32d018021b44e44564fbf2b740272430c7d3..6f3280d02025ccb5f37533c0152880967570f0b0 100644
--- a/src/xercesc/util/XMLAbstractDoubleFloat.hpp
+++ b/src/xercesc/util/XMLAbstractDoubleFloat.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.14  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.13  2003/05/18 14:02:05  knoaman
  * Memory manager implementation: pass per instance manager.
  *
@@ -179,6 +182,11 @@ public:
 
     MemoryManager*        getMemoryManager() const;
 
+    /***
+     * Support for Serialization/De-serialization
+     ***/
+    DECL_XSERIALIZABLE(XMLAbstractDoubleFloat)
+
 protected:
 
     //
diff --git a/src/xercesc/util/XMLBigDecimal.cpp b/src/xercesc/util/XMLBigDecimal.cpp
index aa8969657e53cd7d27b34def4a5d061cd75287a1..888a44ad31f334f89e64bffce7d85de6fc8d6eab 100644
--- a/src/xercesc/util/XMLBigDecimal.cpp
+++ b/src/xercesc/util/XMLBigDecimal.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.11  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.10  2003/08/14 02:57:27  knoaman
  * Code refactoring to improve performance of validation.
  *
@@ -356,5 +359,62 @@ int XMLBigDecimal::toCompare(const XMLBigDecimal& other) const
 
 }
 
+/***
+ * Support for Serialization/De-serialization
+ ***/
+
+IMPL_XSERIALIZABLE_TOCREATE(XMLBigDecimal)
+
+XMLBigDecimal::XMLBigDecimal(MemoryManager* const manager)
+: fSign(0)
+, fTotalDigits(0)
+, fScale(0)
+, fRawDataLen(0)
+, fRawData(0)
+, fIntVal(0)
+, fMemoryManager(manager)
+{
+}
+
+void XMLBigDecimal::serialize(XSerializeEngine& serEng)
+{
+    //REVISIT: may not need to call base since it does nothing
+    XMLNumber::serialize(serEng);
+
+    if (serEng.isStoring())
+    {
+        serEng<<fSign;
+        serEng<<fTotalDigits;
+        serEng<<fScale;
+        serEng<<fRawDataLen;
+
+        serEng.write(fRawData, fRawDataLen);
+
+        int intValLen = XMLString::stringLen(fIntVal);
+        serEng<<intValLen;
+
+        serEng.write(fIntVal, intValLen);
+
+    }
+    else
+    {
+        serEng>>fSign;
+        serEng>>fTotalDigits;
+        serEng>>fScale;
+        serEng>>fRawDataLen;
+
+        fRawData = (XMLCh*) fMemoryManager->allocate(fRawDataLen+1);
+        serEng.read(fRawData, fRawDataLen);
+        fRawData[fRawDataLen] = 0;
+
+        int intValLen = 0;
+        serEng>>intValLen;
+        fIntVal = (XMLCh*) fMemoryManager->allocate(intValLen+1);
+        serEng.read(fIntVal, intValLen);
+        fIntVal[intValLen] = 0;
+    }
+
+}
+
 XERCES_CPP_NAMESPACE_END
 
diff --git a/src/xercesc/util/XMLBigDecimal.hpp b/src/xercesc/util/XMLBigDecimal.hpp
index 8faccd319239776753336d72d6ce2eb50fc2fd8e..16acd31b1b63580fb148e0328d4737ffc1dcf63d 100644
--- a/src/xercesc/util/XMLBigDecimal.hpp
+++ b/src/xercesc/util/XMLBigDecimal.hpp
@@ -128,6 +128,13 @@ public:
      */
     void setDecimalValue(const XMLCh* const strValue);
 
+    /***
+     * Support for Serialization/De-serialization
+     ***/
+    DECL_XSERIALIZABLE(XMLBigDecimal)
+
+    XMLBigDecimal(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
+
 private:
     void  parseBigDecimal( const XMLCh* const strValue
                          , unsigned int       strValueLen);
diff --git a/src/xercesc/util/XMLDateTime.cpp b/src/xercesc/util/XMLDateTime.cpp
index 55e43b2159a22f8cdb1354be38adf3733e12206b..d73377edb2682521157b5854e94102c4df3abff4 100644
--- a/src/xercesc/util/XMLDateTime.cpp
+++ b/src/xercesc/util/XMLDateTime.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.14  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.13  2003/08/14 02:57:27  knoaman
  * Code refactoring to improve performance of validation.
  *
@@ -1431,4 +1434,61 @@ int XMLDateTime::parseIntYear(const int end) const
     return ( negative ? (-1) * yearVal : yearVal );
 }
 
+/***
+ * Support for Serialization/De-serialization
+ ***/
+
+IMPL_XSERIALIZABLE_TOCREATE(XMLDateTime)
+
+void XMLDateTime::serialize(XSerializeEngine& serEng)
+{
+    //REVISIT: may not need to call base since it does nothing
+    XMLNumber::serialize(serEng);
+
+    if (serEng.isStoring())
+    {
+        for (int i = 0; i < TOTAL_SIZE; i++)
+        {
+            serEng<<fValue[i];
+        }
+
+        for (int i = 0; i < TIMEZONE_ARRAYSIZE; i++)
+        {
+            serEng<<fTimeZone[i];
+        }
+
+        serEng<<fStart;
+        serEng<<fEnd;
+        serEng<<fBufferMaxLen;
+
+        int bufferLen = XMLString::stringLen(fBuffer);
+        serEng<<bufferLen;
+        serEng.write(fBuffer, bufferLen);
+    }
+    else
+    {
+        for (int i = 0; i < TOTAL_SIZE; i++)
+        {
+            serEng>>fValue[i];
+        }
+
+        for (int i = 0; i < TIMEZONE_ARRAYSIZE; i++)
+        {
+            serEng>>fTimeZone[i];
+        }
+
+        serEng>>fStart;
+        serEng>>fEnd;
+        serEng>>fBufferMaxLen;
+
+        fBuffer = (XMLCh*) fMemoryManager->allocate(fBufferMaxLen+1);
+
+        int bufferLen = 0;
+        serEng>>bufferLen;
+        serEng.read(fBuffer, bufferLen);
+        fBuffer[bufferLen] = 0;
+    }
+
+}
+
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/util/XMLDateTime.hpp b/src/xercesc/util/XMLDateTime.hpp
index a58bdeb27354e5c6306f7210b552d708c48c1d93..969829669d4aa2906a384493639e41c99d9e7934 100644
--- a/src/xercesc/util/XMLDateTime.hpp
+++ b/src/xercesc/util/XMLDateTime.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.10  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.9  2003/08/14 02:57:27  knoaman
  * Code refactoring to improve performance of validation.
  *
@@ -205,6 +208,11 @@ public:
     static int            compareOrder(const XMLDateTime* const
                                      , const XMLDateTime* const);
 
+    /***
+     * Support for Serialization/De-serialization
+     ***/
+    DECL_XSERIALIZABLE(XMLDateTime)
+
 private:
 
     // -----------------------------------------------------------------------
diff --git a/src/xercesc/util/XMLDouble.cpp b/src/xercesc/util/XMLDouble.cpp
index e3b482099f7350bfd358b67021e86e09209baaeb..8496ffb66aa2a4609125b1e39c46272017fc36d5 100644
--- a/src/xercesc/util/XMLDouble.cpp
+++ b/src/xercesc/util/XMLDouble.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.11  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.10  2003/05/16 06:01:53  knoaman
  * Partial implementation of the configurable memory manager.
  *
@@ -218,4 +221,20 @@ void XMLDouble::checkBoundary(const XMLCh* const strValue)
 
 }
 
+/***
+ * Support for Serialization/De-serialization
+ ***/
+
+IMPL_XSERIALIZABLE_TOCREATE(XMLDouble)
+
+XMLDouble::XMLDouble(MemoryManager* const manager)
+:XMLAbstractDoubleFloat(manager)
+{
+}
+
+void XMLDouble::serialize(XSerializeEngine& serEng)
+{
+    XMLAbstractDoubleFloat::serialize(serEng);
+}
+
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/util/XMLDouble.hpp b/src/xercesc/util/XMLDouble.hpp
index 9576c59928231c47d2d0a22099c9ef7403631bb0..8b67fdcaa45e6d7b9c63e55bee82a9ac3bef482f 100644
--- a/src/xercesc/util/XMLDouble.hpp
+++ b/src/xercesc/util/XMLDouble.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.6  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.5  2003/05/16 06:01:53  knoaman
  * Partial implementation of the configurable memory manager.
  *
@@ -145,6 +148,13 @@ public:
     inline static int            compareValues(const XMLDouble* const lValue
                                              , const XMLDouble* const rValue);
 
+    /***
+     * Support for Serialization/De-serialization
+     ***/
+    DECL_XSERIALIZABLE(XMLDouble)
+
+    XMLDouble(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
+
 protected:
 
     void                  checkBoundary(const XMLCh* const strValue);
diff --git a/src/xercesc/util/XMLFloat.cpp b/src/xercesc/util/XMLFloat.cpp
index 2b9f2507281158a5cadf9ce800784561f32b7da7..771da61c09bcfa31c88f3a989d04834b960a8f32 100644
--- a/src/xercesc/util/XMLFloat.cpp
+++ b/src/xercesc/util/XMLFloat.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.12  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.11  2003/05/16 06:01:53  knoaman
  * Partial implementation of the configurable memory manager.
  *
@@ -237,4 +240,20 @@ void XMLFloat::checkBoundary(const XMLCh* const strValue)
     }
 }
 
+/***
+ * Support for Serialization/De-serialization
+ ***/
+
+IMPL_XSERIALIZABLE_TOCREATE(XMLFloat)
+
+XMLFloat::XMLFloat(MemoryManager* const manager)
+:XMLAbstractDoubleFloat(manager)
+{
+}
+
+void XMLFloat::serialize(XSerializeEngine& serEng)
+{
+    XMLAbstractDoubleFloat::serialize(serEng);
+}
+
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/util/XMLFloat.hpp b/src/xercesc/util/XMLFloat.hpp
index d77d49ea3b744f8385fa9242df109566685190a1..ceb3b7d21da7de22bf53343c4901f7f7688ee625 100644
--- a/src/xercesc/util/XMLFloat.hpp
+++ b/src/xercesc/util/XMLFloat.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.6  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.5  2003/05/16 06:01:53  knoaman
  * Partial implementation of the configurable memory manager.
  *
@@ -139,6 +142,13 @@ public:
     inline static int            compareValues(const XMLFloat* const lValue
                                              , const XMLFloat* const rValue);
 
+    /***
+     * Support for Serialization/De-serialization
+     ***/
+    DECL_XSERIALIZABLE(XMLFloat)
+
+    XMLFloat(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
+
 protected:
 
     void                  checkBoundary(const XMLCh* const strValue);
diff --git a/src/xercesc/util/XMLNumber.cpp b/src/xercesc/util/XMLNumber.cpp
index 29a70c8b713e5fe61fbf8d80174a2f5b871c3f3a..38d6c10cc52dee0bbdd827a8c90e38b6571bbd59 100644
--- a/src/xercesc/util/XMLNumber.cpp
+++ b/src/xercesc/util/XMLNumber.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.3  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.2  2002/11/04 15:22:05  tng
  * C++ Namespace Support.
  *
@@ -84,4 +87,15 @@ XMLNumber::XMLNumber()
 XMLNumber::~XMLNumber()
 {}
 
+/***
+ * Support for Serialization/De-serialization
+ ***/
+
+IMPL_XSERIALIZABLE_NOCREATE(XMLNumber)
+
+void XMLNumber::serialize(XSerializeEngine& serEng)
+{
+    // this class has no data to serialize/de-serilize
+}
+
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/util/XMLNumber.hpp b/src/xercesc/util/XMLNumber.hpp
index 87a23914180f003d7b6e652370052f1c47d60d11..00b955187357b678a5a67e0f5b2dac353804349e 100644
--- a/src/xercesc/util/XMLNumber.hpp
+++ b/src/xercesc/util/XMLNumber.hpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.8  2003/09/23 18:16:07  peiyongz
+ * Inplementation for Serialization/Deserialization
+ *
  * Revision 1.7  2003/05/15 19:07:46  knoaman
  * Partial implementation of the configurable memory manager.
  *
@@ -89,11 +92,12 @@
 #ifndef XMLNUMBER_HPP
 #define XMLNUMBER_HPP
 
+#include <xercesc/internal/XSerializable.hpp>
 #include <xercesc/util/XMemory.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
-class XMLUTIL_EXPORT XMLNumber : public XMemory
+class XMLUTIL_EXPORT XMLNumber : public XSerializable, public XMemory
 {
 public:
 
@@ -145,6 +149,11 @@ public:
 	 */
     virtual int        getSign() const = 0;
 
+    /***
+     * Support for Serialization/De-serialization
+     ***/
+    DECL_XSERIALIZABLE(XMLNumber)
+
 protected:
 
     XMLNumber();