是否可以在C++中序列化和反序列化一个类?
我已经使用Java 3年了,序列化/反序列化在这种语言中相当简单.C++有类似的功能吗?是否有处理序列化的本机库?
一个例子会有所帮助.
看看Java和C#,他们设法根据基于特殊语言的anotation做一些邪恶的处理(如果这是不正确的名字,请原谅我).
在C++中,我们有两个问题:
1)无法使用在运行时可访问的类型信息来注释类.
2)解析源以生成东西是复杂的方法.
但我认为这可以通过一些模板元编程来完成,以实现与anotations相同的基本效果(仍然只是考虑它).与专门针对不同类型的char_traits一样,xml_traits模板可以以明确的方式使用.此traits类可用于通过专门化您尝试序列化的类的特征来定义类的序列化/反序列化方式.
template<typename T>
struct XML_traits
{
    typedef XML_Empty   Children;
};
template<>
struct XML_traits<Car>
{
    typedef boost::mpl::vector<Body,Wheels,Engine>   Children;
};
template<typename T>
std::ostream& Serialize(T const&)
{
    // my template foo is not that strong.
    // but somthing like this.
    boost::mpl::for_each<typename XML_Traits<T>::Children,Serialize>(data);
}
template<>
std::ostream& Serialize<XML_Empty>(T const&)
{ /* Do Nothing */ }
有没有人看到任何项目/ decumentation(不仅仅是XML)使用这样的技术(模板元编程)来模拟在Java和C#等语言中使用的注释概念,然后可以在代码生成中使用(以有效地自动化)使用声明式的任务).
在我的研究的这一点上,我正在寻找更多的阅读材料和例子.
可能重复:
如何在c ++中序列化?
如何在C++中实现序列化
这些天我越来越多地使用C++,并且此时只有一些关于ofstream的经验.大多数所述经验都是对变量进行简单的文件输出,并使用ifstream将其读回.我没做过的是任何有物体的东西.
让我们假设我有一个经常被写入的对象(比如游戏,对象就是角色)每次击中角色时,每次击败他们获得经验的敌人时,都会重新编写hp. ...我的基本想法是编写一个简单的基于文本的地下城爬行游戏.但是我如何制作某种自动保存文件?我是否只是将对象的每个属性单独写入文件,然后从那里移到更大更好的位置?如果我现在必须这样做,那就是我要去做的事情,但是我不禁感到有一种比这更简单的方式....
有人帮我把整个对象的内容(以及它各自的属性)输出到文件中吗?
我最近在网上找到了这个漂亮的片段 - 它允许你绑定而不必传递明确的占位符:
template <typename ReturnType, typename... Args>
std::function<ReturnType(Args...)> 
easy_bind(ReturnType(*MemPtr)(Args...))
{
  return [=]( Args... args ) -> ReturnType { return (*MemPtr)( args... ); };
}
这个版本很好用没有args:
auto f1 = easy_bind( (std::string(*)(A&,A&))&Worker::MyFn );
后来调用:
std::string s = f1( *p_a1, *p_a2 );
题
是否可以修改代码以使用最多n个args,用占位符填充2-n(在本例中)?例如,这个应该有一个占位符:
auto f2 = easy_bind( (std::string(*)(A&,A&))&Worker::MyFn, *p_a1 );     
后来调用:
std::string s = f2( *p_a2 );
奖金
最终,有这样的东西很好(它不会插入任何占位符,因为它会消耗掉最后一个占位符),但我不认为它对这个实现是可行的(我认为不能模式匹配签名):
auto f3 = easy_bind( f2, *p_a2 );     
后来调用:
std::string s = f3();
最重要的是,拥有一个我不需要放在占位符中的bind版本会很好 - 这在通用TMP代码中非常有用.
我正在寻找一种简单的方法将C++中的对象转换为XML字符串表示,这样我就可以与服务器进行通信.
例如,让我们说我有一个对象:
class A{
    string data1;
    string data2;
    string dataN;
    list<B> bList;
}
class B{
    string moreData;
}
我想要以下XML表示:(假设我创建了一个实例A,它有两个B实例)
<A>
    <data1>content</data1>
    <data2>content</data2>
    <dataN>content</dataN>
    <B>
        <moreData>content</moreData>
    </B>    
    <B>
        <moreData>content</moreData>
    </B>
</A>
我想实现一个序列化类,它接收一个对象并将其转换为二进制流并存储在一个文件中.之后,应该从文件重建对象.
虽然这个功能是由C#中的BinaryFormatter提供的,但我想从头开始设计自己的Serialization类.
有人能指出一些资源吗?
提前致谢
c++ ×7
xml ×2
c++11 ×1
declarative ×1
marshalling ×1
object ×1
oop ×1
persistence ×1
templates ×1