#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;
}
2010年10月23日 星期六
Serialization ( Serialize & Deserialize )
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言