我想序列化一个我没有写入权限的类。即,我无法更改源文件或头文件。此外,大多数字段都是私有的,可以通过getter和setter函数访问。
任何人都可以告诉我,创建不同的保存和加载功能是否是个好主意(如boost tutorial中所述)......
template<class Archive>
void save(Archive & ar, gps_position &g, const unsigned int version) const
{
// note, version is always the latest when saving
ar & g.deg;
ar & g.min;
}
template<class Archive>
void load(Archive & ar, gps_position &g, const unsigned int version)
{
if(version > 0)
ar & g.deg;
ar & g.min;
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
...并使用公共功能:
ar & g.getDeg();
而不是
ar & g.deg;
(类似于二传手)?我是c ++和序列化的新手,我非常感谢任何提示!
最好,亚历克斯
编辑:添加了提升教程的链接
答案 0 :(得分:0)
template<class Archive>
void load(Archive & ar, gps_position &g, const unsigned int version)
{
if(version > 0)
{
int d = 0;
ar & d;
g.setDeg(d);
int m = 0;
ar & m;
g.setMin(m);
}
}
像这样的事情。声明变量 - &gt;从档案中读取 - &gt;通过调用setter函数设置为member。
答案 1 :(得分:0)
这是OP正在讨论的教程:
http://www.boost.org/doc/libs/1_50_0/libs/serialization/doc/tutorial.html
我发现使用拆分功能有时是必要的,并且在必要时也不是一个坏主意。使用单个void serialize(...)
函数非常方便,但是当我尝试序列化的类无法更改时(我正在遇到的情况),我不得不拆分它们。我绝对不会回避将void serialize(...)
分成void save(...)
和void load(...)
,如果这就是它将会采取的行动。如果内存对我有用,我不得不分成两个函数,因为我__gnu_cxx::hash_map
支持在几年前的某一点上并不是很好,所以我做了一些黑客攻击以获取数据序列化。
tutorial让你前进,但它有点缺乏,每次我使用Boost.Serialization时都会遇到一些困难。这是一个方便的库。