diff --git a/src/xercesc/internal/XTemplateSerializer.cpp b/src/xercesc/internal/XTemplateSerializer.cpp
index fb1ee43de64aa7ada21589f28cefd0c336bb0852..e344a54a420b9b2f021c56c9dbac70f51c883bde 100644
--- a/src/xercesc/internal/XTemplateSerializer.cpp
+++ b/src/xercesc/internal/XTemplateSerializer.cpp
@@ -57,6 +57,9 @@
 /*
  * $Id$
  * $Log$
+ * Revision 1.9  2004/03/09 20:59:28  peiyongz
+ * restore key string from string pool from datatypevalidator
+ *
  * Revision 1.8  2004/03/01 23:20:46  peiyongz
  * For RefHashTableOf/RefHash2KeysTableOf/RefHashTable3KeysIdPool,
  * resovle "key string" either from the data itself or the GrammarPool's StringPool.
@@ -1295,7 +1298,15 @@ void XTemplateSerializer::storeObject(RefHashTableOf<DatatypeValidator>* const o
 
         while (e.hasMoreElements())
         {
-            DatatypeValidator* data = objToStore->get(e.nextElementKey());            
+            /***
+             * to do: verify valid id
+             *
+             *    XMLCh*  key = (XMLCh*) e.nextElementKey();
+             *    unsigned int id = serEng.getStringPool()->getId(key);
+             *    if (id == 0)
+             *        throw exception
+             ***/
+            DatatypeValidator* data = objToStore->get(e.nextElementKey());
             DatatypeValidator::storeDV(serEng, data);
         }
     }
@@ -1329,12 +1340,37 @@ void XTemplateSerializer::loadObject(RefHashTableOf<DatatypeValidator>** objToLo
         serEng>>itemNumber;
 
         for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
-        {
+        {           
             DatatypeValidator*  data;
             data = DatatypeValidator::loadDV(serEng);
 
-            XMLCh*  key = (XMLCh*) data->getTypeName();
-            (*objToLoad)->put((void*)key, data);
+            /***
+             *   restore the key
+             ***/
+            XMLCh*       typeUri   = (XMLCh*) data->getTypeUri();
+            XMLCh*       typeLocal = (XMLCh*) data->getTypeLocalName();
+            unsigned int uriLen    = XMLString::stringLen(typeUri);
+            unsigned int localLen  = XMLString::stringLen(typeLocal);
+            XMLCh*       typeKey   = (XMLCh*) serEng.getMemoryManager()->allocate
+                                     (
+                                       (uriLen + localLen + 2) * sizeof(XMLCh)
+                                     );
+            // "typeuri,typeLocal"
+            XMLString::moveChars(typeKey, typeUri, uriLen+1);
+            typeKey[uriLen] = chComma;
+            XMLString::moveChars(&typeKey[uriLen+1], typeLocal, localLen+1);
+            typeKey[uriLen + localLen + 1] = chNull;
+            ArrayJanitor<XMLCh> janName(typeKey, serEng.getMemoryManager());
+            
+            /*
+             * get the string from string pool
+             *
+             *  to do:
+             ***/
+            unsigned int id = serEng.getStringPool()->getId(typeKey);   
+            XMLCh* refKey = (XMLCh*) serEng.getStringPool()->getValueForId(id);      
+
+            (*objToLoad)->put((void*)refKey, data);
         }
     }
 }