我有类(class)并且我已经实现了序列化功能(这是我用来存储文件和从文件反序列化的功能)
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & id;
ar & first_name;
ar & last_name;
ar & salary;
ar & username;
// and lot of more data
ar & data;
}
除了将成员(不是全部,例如 id、用户名、薪水)序列化为 char 数组(用于通过 tcp 发送类似消息)并反序列化(在客户端)之外,我还需要什么。 我如何重载序列化以让一个用于文件存储而另一个用于 tcp 消息?
最佳答案
您可以创建自己的Archive
类,然后为您的类专门化serialize()
函数模板:
template<>
void serialize(MyBriefOutputArchive& ar, const unsigned int version) {
// Alternative serialization.
}
template<>
void serialize(MyBriefInputArchive& ar, const unsigned int version) {
// Alternative deserialization.
}
要制作您自己的存档类,您可以子类化或复制 Boost 类,以便它们在其他方面的工作方式相同。要小心,因为一些归档类,比如 boost::binary_oarchive
和 boost::binary_iarchive
, 有标题注释说它们不应该被子类化——你应该复制它们的实现(这很简单,因为所有的工作都在它们的父类(super class)中完成)。
如果您使用一些模板元编程技巧,您可以在通用 serialize()
中识别您自己的存档类,而无需专门化。这在 DRY principle 下是首选,但首先使用特化可能更容易。
关于c++ - 我怎样才能重载序列化 boost 功能,让一个用于文件存储,另一个用于 tcp 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23417630/