[Ideas] Generic Serialization Framework

[Ideas] Generic Serialization Framework

 

  1 /**/ //////////////////////////////////////////////////////////////////////////
  2 enum  SerializeType
  3 {
  4   ST_Read,
  5   ST_Write,
  6}
;
  7
  8 /**/ //////////////////////////////////////////////////////////////////////////
  9 //  The basic template for both serialize and desierialze
 10 template < SerializeType nType,  class  TStream,   class  TDataType >
 11 class  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
 23 template < SerializeType nType,  class  TStream,   class  TDataType >
 24 inline  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
 34 template < class  TStream >
 35 class  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
 45 template < class  TStream >
 46 class  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
 58 class  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
 74 template < SerializeType nType,   class  TStream >
 75 class  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
 88 class  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
108 int  _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

你可能感兴趣的:([Ideas] Generic Serialization Framework)