2010年10月23日 星期六

Serialization ( Serialize & Deserialize )

#include <string>
#include <sstream>
#include <regex>
#include <map>
#include <iostream>

using namespace std;

/************************************************************************/

class my_oarchive {
private:
  string &m_s;
  stringstream m_ss;
public:
  my_oarchive(string &s): m_s(s), m_ss() {
    m_ss << "{";
  }
  ~my_oarchive(void) {
    m_ss << "}" << flush;
    m_s = m_ss.str();
    m_ss.clear();
  }
public:
  template <typename struct_type>
  my_oarchive &operator <<(const struct_type &d) {
    serialize(*this, const_cast<struct_type &>(d));
    return *this;
  }
  template <size_t N>
  my_oarchive &Item(const char(&varname)[N], const int &data) {
    m_ss << "\"" << varname << "\":" << data << ",";
    return *this;
  }
  template <size_t N>
  my_oarchive &Item(const char(&varname)[N], const unsigned int &data) {
    m_ss << "\"" << varname << "\":" << data << ",";
    return *this;
  }
  template <size_t N, size_t N1>
  my_oarchive &Item(const char(&varname)[N], const char(&data)[N1]) {
    m_ss << "\"" << varname << "\":\"" << data << "\",";
    return *this;
  }
};

class my_iarchive {
private:
  string &m_s;
  map<string, string> m_table;
public:
  my_iarchive(string &s): m_s(s) {
    tr1::regex rx("\"(\\w+)\":\"?(-?\\w+)\"?");
    tr1::sregex_iterator itrBegin(m_s.begin(), m_s.end(), rx), itrEnd;
    for(tr1::sregex_iterator itr = itrBegin; itr != itrEnd; ++itr) {
      m_table[itr->str(1)] = itr->str(2);
    }
  }
  ~my_iarchive(void) {}
public:
  template <typename struct_type>
  my_iarchive &operator >>(struct_type &d) {
    serialize(*this, d);
    return *this;
  }
  template <size_t N>
  my_iarchive &Item(const char(&varname)[N], int &data) {
    stringstream(m_table[varname]) >> data;
    return *this;
  }
  template <size_t N>
  my_iarchive &Item(const char(&varname)[N], unsigned int &data) {
    stringstream(m_table[varname]) >> data;
    return *this;
  }
  template <size_t N, size_t N1>
  my_iarchive &Item(const char(&varname)[N], char(&data)[N1]) {
    stringstream(m_table[varname]).getline(data, N1);
    return *this;
  }
};

/************************************************************************/

struct Player {
  int iPlayerID;
  int iPlayerHaveMoney;
  char iPlayerName[64];
};

template<class Archive>
void serialize(Archive &ar, Player &d) {
  ar.Item("iPlayerID",  d.iPlayerID);
  ar.Item("iPlayerHaveMoney", d.iPlayerHaveMoney);
  ar.Item("iPlayerName",  d.iPlayerName);
  //#define ITEM(a, g, name) (a.Item(#name, g.name));
}

/************************************************************************/

int main(int argc, char *argv[]) {
  string s;
  {
    const Player g = {100, 20, "Jenson"};
    my_oarchive a(s);
    a << g;
  }
  cout << s << endl;
  {
    Player gnew;
    my_iarchive a(s);
    a >> gnew;
    cout << "iPlayerID = " << gnew.iPlayerID << endl;
    cout << "iPlayerHaveMoney = " << gnew.iPlayerHaveMoney << endl;
    cout << "iPlayerName = " << gnew.iPlayerName << endl;
  }
  system("pause");
  return EXIT_SUCCESS;
}

沒有留言:

張貼留言