我有一个模板化容器类,它在内部将数据存储在以下静态数据变量中:
template<typename T>
class Container {
// ... Access methods
std::map<unsigned int, std::map<unsigned int, boost::shared_ptr<T>>
};
第一个unsigned int是使用此集合的Client的id,第二个unsigned int用于标识Client对象中的SubClient。 Client对象只包含SubClient的ID,而SubClient本身不包含任何数据。
现在我需要将整个客户端结构保存到文件中。那是在呼唤:
Client c;
/* Some operations on c */
c.Serialize(output);
应该生成一个文件,其中包含SubClient的ID和容器类中的关联数据。现在,因为可以在容器类中使用的类型几乎可以是任何类型,并且从代码库一直添加和删除新类型如何序列化和反序列化这些数据? 问题,我怎么看,是因为数据类型没有唯一的ID,可用于将文件的一部分标识为属于容纳特定数据的Container,也不能以任何明确的方式排序(或者它们可以吗? )。
如何通过尽可能少地更改用于容器的数据类型来解决此问题。
答案 0 :(得分:1)
您已经完美地描述了Boost.Serialization的功能。不需要更改容器或其数据类型。该库已内置支持序列化STL容器和boost::shared_ptr
。虽然您可能需要为T
添加序列化方法,具体取决于它是什么。
答案 1 :(得分:0)
对于容器本身,您可以使用std::for_each
,从而遍历整个事物,但每个单独的数据实例(类型为T
的实例),您将必须实现序列化您将从for_each
调用的函数调用的方法。
该函数可能必须使用dynamic_cast
运算符,才能从指针中获取实际对象,并确保它是有效的。