相关疑难解决方法(0)

是否可以在C++中序列化和反序列化一个类?

是否可以在C++中序列化和反序列化一个类?

我已经使用Java 3年了,序列化/反序列化在这种语言中相当简单.C++有类似的功能吗?是否有处理序列化的本机库?

一个例子会有所帮助.

c++ serialization

131
推荐指数
6
解决办法
13万
查看次数

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 */ }
Run Code Online (Sandbox Code Playgroud)

我的问题是:

有没有人看到任何项目/ decumentation(不仅仅是XML)使用这样的技术(模板元编程)来模拟在Java和C#等语言中使用的注释概念,然后可以在代码生成中使用(以有效地自动化)使用声明式的任务).

在我的研究的这一点上,我正在寻找更多的阅读材料和例子.

c++ xml serialization metaprogramming declarative

14
推荐指数
1
解决办法
1080
查看次数

9
推荐指数
3
解决办法
6636
查看次数

C++将一个对象写入一个文件,然后再将其读入?

可能重复:
如何在c ++中序列化?
如何在C++中实现序列化

这些天我越来越多地使用C++,并且此时只有一些关于ofstream的经验.大多数所述经验都是对变量进行简单的文件输出,并使用ifstream将其读回.我没做过的是任何有物体的东西.

让我们假设我有一个经常被写入的对象(比如游戏,对象就是角色)每次击中角色时,每次击败他们获得经验的敌人时,都会重新编写hp. ...我的基本想法是编写一个简单的基于文本的地下城爬行游戏.但是我如何制作某种自动保存文件?我是否只是将对象的每个属性单独写入文件,然后从那里移到更大更好的位置?如果我现在必须这样做,那就是我要去做的事情,但是我不禁感到有一种比这更简单的方式....

有人帮我把整个对象的内容(以及它各自的属性)输出到文件中吗?

c++ serialization object

9
推荐指数
1
解决办法
2万
查看次数

如何实现一个自动插入隐含占位符的easy_bind()?

我最近在网上找到了这个漂亮的片段 - 它允许你绑定而不必传递明确的占位符:

template <typename ReturnType, typename... Args>
std::function<ReturnType(Args...)> 
easy_bind(ReturnType(*MemPtr)(Args...))
{
  return [=]( Args... args ) -> ReturnType { return (*MemPtr)( args... ); };
}
Run Code Online (Sandbox Code Playgroud)

这个版本很好用没有args:

auto f1 = easy_bind( (std::string(*)(A&,A&))&Worker::MyFn );
Run Code Online (Sandbox Code Playgroud)

后来调用:

std::string s = f1( *p_a1, *p_a2 );
Run Code Online (Sandbox Code Playgroud)

是否可以修改代码以使用最多n个args,用占位符填充2-n(在本例中)?例如,这个应该有一个占位符:

auto f2 = easy_bind( (std::string(*)(A&,A&))&Worker::MyFn, *p_a1 );     
Run Code Online (Sandbox Code Playgroud)

后来调用:

std::string s = f2( *p_a2 );
Run Code Online (Sandbox Code Playgroud)

奖金

最终,有这样的东西很好(它不会插入任何占位符,因为它会消耗掉最后一个占位符),但我不认为它对这个实现是可行的(我认为不能模式匹配签名):

auto f3 = easy_bind( f2, *p_a2 );     
Run Code Online (Sandbox Code Playgroud)

后来调用:

std::string s = f3();
Run Code Online (Sandbox Code Playgroud)

最重要的是,拥有一个我不需要放在占位符中的bind版本会很好 - 这在通用TMP代码中非常有用.

c++ templates variadic-templates c++11

7
推荐指数
1
解决办法
2225
查看次数

C++ Object to XML用于通信

我正在寻找一种简单的方法将C++中的对象转换为XML字符串表示,这样我就可以与服务器进行通信.

例如,让我们说我有一个对象:

class A{
    string data1;
    string data2;
    string dataN;
    list<B> bList;
}

class B{
    string moreData;
}
Run Code Online (Sandbox Code Playgroud)

我想要以下XML表示:(假设我创建了一个实例A,它有两个B实例)

<A>
    <data1>content</data1>
    <data2>content</data2>
    <dataN>content</dataN>
    <B>
        <moreData>content</moreData>
    </B>    
    <B>
        <moreData>content</moreData>
    </B>
</A>
Run Code Online (Sandbox Code Playgroud)

c++ xml serialization xml-serialization

6
推荐指数
1
解决办法
4193
查看次数

序列化C++对象

我想实现一个序列化类,它接收一个对象并将其转换为二进制流并存储在一个文件中.之后,应该从文件重建对象.

虽然这个功能是由C#中的BinaryFormatter提供的,但我想从头开始设计自己的Serialization类.

有人能指出一些资源吗?

提前致谢

c++ serialization marshalling unmarshalling deserialization

4
推荐指数
1
解决办法
4344
查看次数