求自定义类对象序列化原理和方案,该怎么解决

求自定义类对象序列化原理和方案
网络通信经常需要使用序列化,而C++又不像Java、C#本身就实现了序列化功能,那么C++如何对一个自定义类对象进行序列化和反序列化呢?请指教!另外,最好能够提供一些例程,谢谢!

如下面的类:
C/C++ code

class msg
{
public:
     ... ...

private:
     string id;
     string name;
     string data;
};



------解决方案--------------------
1.提供一个私有方法 bool CircularBuffer::_Put(const void* pData, int nSize);
功能:将一段数据拷贝到自己的存储区。

2.重写每种类型的序列化方法
//下面是针对内建类型
template <typename T>
inline CircularBuffer & CircularBuffer::operator<<( const T& data )
{
Put(&data, sizeof(data));
return *this;
}

// 针对各种STL容器,以及自己定义的类
inline CircularBuffer& CircularBuffer::operator<< ( const std::string & str)
{
*this << str.size();
Put(str.c_str(), str.size());
return *this;
}

//
3 自己定义的类
class msg
{
public:
friend CircularBuffer& operator<< (CircularBuffer& cb, const msg& message)
{
return cb << message.id << message.name << message.data;
}

private:
string id;
string name;
string data;
};

------解决方案--------------------
http://wenku.baidu.com/view/456122c30c22590102029d67.html
------解决方案--------------------
可以看看boost的序列化库。
C/C++ code
#include <fstream>
#include <iostream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
class A
{
private:
    //为了能让串行化类库能够访问私有成员,所以要声明一个友元类
    friend class boost::serialization::access;
    //对象的数据
    int a;
    double b;
    //串行化的函数,这一个函数完成对象的保存与恢复
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & a; //就是这么简单,也可以使用 ar<<a 这样的语法
        ar & b;
    }
public:
    A(int aa, double bb) :
            a(aa),
            b(bb)
    {
    }
    A()
    {
    }
    void print()
    {
        std::cout << a << ' ' << b << std::endl;
    }
};
int main()
{
    std::ofstream fout("file.txt"); //把对象写到file.txt文件中
    boost::archive::text_oarchive oa(fout); //文本的输出归档类,使用一个ostream来构造
    A obj(1, 2.5);
    oa << obj; //保存obj对象
    fout.close(); //关闭文件

    std::ifstream fin("file.txt");
    boost::archive::text_iarchive ia(fin); //文本的输入归档类
    A newobj;
    ia >> newobj; //恢复到newobj对象
    newobj.print();
    fin.close();
    system("pause");
    return 0;
}

------解决方案--------------------
boost::serialization
protocol buffer
thrift
都有缺陷
protocol buffer
thrift
对自定义的类的成员对象不支持(我没用过)
boost::serialization
对自定义的类的成员的多态指针支持不好,不能自动识别。

C++下目前还没有java那样好的序列化,主要是C++没有反射
------解决方案--------------------
Boost使用很简单。
否则象一楼说的一样也可以。

关键技巧在于,给你的类里写一个接口,序列化和反序列化都使用这个接口,
所以你具体的序列化方案,或接口中序列化变量的顺序都不重要。

Class ClassA{
 int a;
 int b;
 ClassC c;
 virtual void serialize(Archive& ar) //真正负责序列化或反序列化的是Archive的子类
 {
ar.io(a);
ar.io(b);
ar.io(c)
 }
}

class Archive{
 virtual void io(int );
 virtual void io(double );
 template<class T> //递归自己定义的类
 void io(T t){
t.io(*this);
 }
} 
Boost使用很简单。
否则象一楼说的一样也可以。

关键技巧在于,给你的类里写一个接口,序列化和反序列化都使用这个接口

Class ClassA{
 int a;
 int b;
 ClassC c;