c++ - 我怎样才能重载序列化 boost 功能,让一个用于文件存储,另一个用于 tcp 消息?

标签 c++ c++11 boost

我有类(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_oarchiveboost::binary_iarchive , 有标题注释说它们不应该被子类化——你应该复制它们的实现(这很简单,因为所有的工作都在它们的父类(super class)中完成)。

如果您使用一些模板元编程技巧,您可以在通用 serialize() 中识别您自己的存档类,而无需专门化。这在 DRY principle 下是首选,但首先使用特化可能更容易。

关于c++ - 我怎样才能重载序列化 boost 功能,让一个用于文件存储,另一个用于 tcp 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23417630/

相关文章:

c++ - 将输入流迭代器与数组一起使用

c++ - 哪些 C++0x header 应该定义 nullptr?

C++11 参数包重载

c++ - 构造一个包含变量类型索引中第 n 类型值的 boost 变量?

c++ - C++ 中的多个整数类型类

c++ - 如何解析UTF-8中文字符串

c++ - functors_sort :vector

c++ - GPU 加速 LK 金字塔中的窗口大小限制

c++ - 在 C++ 中接受 "anything"的模板

c++ - 快速排序不排序 C++