以自定义方式提升序列化数据

Posted

技术标签:

【中文标题】以自定义方式提升序列化数据【英文标题】: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> pnew int1123;
        boost::archive::text_oarchive oa(ss);
        oa << p1;

        // deserialize
        boost::archive::text_iarchive ia(ss);
        boost::shared_ptr<int> p_inew int1123;
        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
        
    

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

【问题讨论】:

【参考方案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_free见documentation

【讨论】:

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

以上是关于以自定义方式提升序列化数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Boost Property 树库中,我如何以自定义方式处理文件未找到错误(C++)

Protobuf ParseDelimitedFrom C++ 中的实现

提升属性树值(反)序列化

WeihanLi.Redis自定义序列化及压缩方式

提升序列化数据的十六进制十进制编码

提升序列化省略包装器的版本