【问题标题】:Boost Serialize data in a custom way以自定义方式提升序列化数据
【发布时间】:2018-07-16 14:50:45
【问题描述】:

假设我有一个存储在 map 某处的对象列表。我的目标是通过这样的键序列化所有共享指针:

namespace boost { namespace serialization {

template<class Archive, class T>
inline void serialize(Archive& ar, boost::shared_ptr<T>& b, const unsigned int file_version)
{
    std::string key_of_b = // get a key of object b;
    ar << key_of_b;
}

} }

然后,在序列化过程中,通过序列化的key,取回map中的对象。是否可以仅使用 boost::shared_ptr 序列化-反序列化对象?喜欢:

int main() {

        std::stringstream ss;

        // serialize
        boost::shared_ptr<int> p{new int{1123}};
        boost::archive::text_oarchive oa(ss);
        oa << p1;

        // deserialize
        boost::archive::text_iarchive ia(ss);
        boost::shared_ptr<int> p_i{new int{1123}};
        ia >> p_i;

        return 0;
    }

我知道代码不能以这种方式工作。我想在serialize 方法中处理序列化/反序列化:

template<class Archive, class T>
    inline void serialize(Archive& ar, boost::shared_ptr<T>& b, const unsigned int file_version)
    {
        if (boost::archive::text_oarchive::is_saving::value) {
          std::string key_of_b = // get a key of object b;
          ar << key_of_b;
        } else {
          std::string key;
          ar >> key;
          // get the T
        }
    }

这是正确的还是有其他更好的方法?

【问题讨论】:

    标签: c++ serialization boost


    【解决方案1】:

    由于您具体讨论的是某些T,因此不要在boost 命名空间内提供过于通用的serialize 模板。

    相反,利用ADL 并将其与您的自定义类型放在一起:

    namespace MyLib {
        struct MyType { /*....*/ };
    
        template<class Archive>
        void save(Archive& ar, boost::shared_ptr<MyType> const& p, unsigned)
        {
            ...
        }
        template<class Archive>
        void load(Archive& ar, boost::shared_ptr<MyType>& p, unsigned)
        {
            ...
        }
    
        template<class Archive> inline void serialize(Archive& ar, boost::shared_ptr<MyType>& p, unsigned file_version) {
            split_free(ar, p, file_version); 
        }
    
    } // namespace MyLib
    

    关于split_freedocumentation

    【讨论】:

    • 对不起我的错误。我可以有很多 T,但我不能为每个 T 使用序列化方法。
    • 不过,像这样使用 ADL 可以避免冲突。您可以打开模板,但将其保留在声明的命名空间中。另外,我认为您需要重新考虑您的序列化方法。在我看来,您正在特别对待共享指针。 T 可能是fly-weight objects?在这种情况下,请考虑明确表达“享元”模式(而不是“匿名”shared_ptr 用法),以便将语义附加到该类型。
    • 这显然是一个猜测,所以在你指出猜测(显然)不准确之前,概括一下:我建议的概念转变是在自定义类型中编码语义。 (你仍然可以在里面使用shared_ptr)。作为中间立场,您可以使用serialization wrappers
    • Ts 不能是飞重对象。无论如何,感谢您的帮助。您的解决方案解决了问题。
    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 2019-11-24
    • 2022-12-31
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多