力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks

 

  1//////////////////////////////////////////////////////////////////////////
  2enum SerializeType
  3{
  4   ST_Read,
  5   ST_Write,
  6}
;
  7
  8//////////////////////////////////////////////////////////////////////////
  9// The basic template for both serialize and desierialze
 10template<SerializeType nType, class TStream,  class TDataType>
 11class Serialize
 12{
 13   typedef TDataType DataType;
 14public:
 15   Serialize(TStream& stream, DataType& data)
 16   {
 17      // Please specialize your own Serialize Class
 18      assert(false);
 19   }

 20}
;
 21
 22// Helper function to simplify the usage
 23template<SerializeType nType, class TStream,  class TDataType>
 24inline void SerializeFunc(TStream& stream, TDataType& data)
 25{
 26   typedef Serialize<nType, TStream, TDataType> Serializer;
 27   Serializer ss(stream, data);
 28}

 29
 30//////////////////////////////////////////////////////////////////////////
 31// string Serialize class
 32// To demonstrate the native data type 
 33// Read
 34template<class TStream>
 35class Serialize< ST_Read, TStream, std::string>
 36{   
 37   typedef std::string DataType;
 38public:
 39   Serialize(TStream& stream, DataType& data)
 40   {
 41      stream >> data;
 42   }

 43}
;
 44// Write
 45template<class TStream>
 46class Serialize<ST_Write, TStream, std::string>
 47{   
 48   typedef std::string DataType;
 49public:
 50   Serialize(TStream& stream, DataType& data)
 51   {
 52      stream << data;
 53   }

 54}
;
 55
 56//////////////////////////////////////////////////////////////////////////
 57// Test Class
 58class TestClass
 59{
 60public:
 61   TestClass()
 62      :m_Name("Name")
 63      ,m_Id("Id")
 64   {
 65
 66   }

 67
 68public:
 69   std::string m_Name;
 70   std::string m_Id;
 71}
;
 72
 73// Partial Specialize the Serialize Class
 74template<SerializeType nType,  class TStream>
 75class Serialize<nType, TStream, TestClass>
 76{
 77   typedef TestClass DataType;
 78public:
 79   Serialize(TStream& stream, DataType& data)
 80   {
 81      SerializeFunc<nType>(stream, data.m_Name);
 82      SerializeFunc<nType>(stream, data.m_Id);
 83   }

 84}
;
 85
 86//////////////////////////////////////////////////////////////////////////
 87// Customized stream
 88class CustomStream
 89{
 90public:
 91   template<class TDataType>
 92   CustomStream& operator >> (TDataType& data)
 93   {
 94      std::cin >> data;
 95      return *this;
 96   }

 97
 98   template<class TDataType>
 99   CustomStream& operator << (TDataType& data)
100   {
101      std::cout << "[" << data << "]" << std::endl;
102      return *this;
103   }

104}
;
105
106//////////////////////////////////////////////////////////////////////////
107
108int _tmain(int argc, _TCHAR* argv[])
109{
110   CustomStream stream;
111
112   TestClass testObject;
113   SerializeFunc<ST_Write>(std::cout, testObject);
114   std::cout << std::flush;
115
116   SerializeFunc<ST_Read>(stream, testObject);
117   SerializeFunc<ST_Write>(stream, testObject);
118
119   std::cout << "Please any key to exit!";
120   char ch;
121   std::cin >> ch;
122    return 0;
123}

124
posted on 2010-09-30 15:08 力为 阅读(1346) 评论(0)  编辑 收藏 引用 所属分类: 5. GP&STL&BOOST

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理