将Boost与getter和setter一起使用?

时间:2012-08-09 15:05:18

标签: c++ boost

我想序列化一个我没有写入权限的类。即,我无法更改源文件或头文件。此外,大多数字段都是私有的,可以通过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 ++和序列化的新手,我非常感谢任何提示!

最好,亚历克斯

编辑:添加了提升教程的链接

2 个答案:

答案 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时都会遇到一些困难。这是一个方便的库。