Boost Serialise Boost Interprocess字符串

时间:2018-01-15 14:12:44

标签: c++ boost boost-serialization boost-interprocess

我有一个结构实例,通过Boost进程传递给TCP / IP客户端,在客户端我需要使用Boost序列化库对其进行序列化。由于这个结构包含boost :: interprocess basic_string,它不能直接串行化,所以我通过使用它们来构建序列化函数中的std :: string'来解决这个问题。

nth-of-type

如果没有构造函数开销,有没有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

适用于std::string

#include <boost/serialization/string.hpp>

诀窍。说实话,我有点惊讶他们没有添加boost::container::basic_string<>支持 - 显然这对于​​YEARS来说是一个悬而未决的问题:https://svn.boost.org/trac10/ticket/8174

所以,我想你现在就手动完成。

你的“拐杖”解决方案将是最快的胜利。说实话,我不会投入更多时间,除非我确切知道你面临的情况。

  

注意一个重要的实现是std::string(正确)标记为“基本类型”用于升级序列化,这可以防止由于对象跟踪而产生的头痛临时字符串对象。请务必在上面添加标题以确保正确的行为。

在这一点上,我同时使用共享内存序列化对我来说有点奇怪。您很可能直接利用共享内存缓冲区特征 -  见例如http://www.boost.org/doc/libs/1_66_0/doc/html/interprocess/managed_memory_segments.html#interprocess.managed_memory_segments.managed_heap_memory_external_buffer)。

答案 1 :(得分:1)

对于任何想要它的人,我通过使用boost :: interprocess库源代码来序列化std :: vector找到了答案,它与我使用的内容略有不同,因为我使用它1.65 so&#39; boost :: serialization :: stl :: load_collection&#39;已被弃用。

如果有更好的方法,请发帖。

template<typename _Archive, typename _T1, typename _T2, typename _Alloc>
inline void save( _Archive &ar, boost::interprocess::basic_string<_T1, _T2, _Alloc> const str, unsigned int const version )
{
    boost::serialization::stl::save_collection<
        _Archive,
        boost::interprocess::basic_string<_T1, _T2, _Alloc>>( ar, str );
}


template<typename _Archive, typename _T1, typename _T2, typename _Alloc>
inline void load( _Archive &ar, boost::interprocess::basic_string<_T1, _T2, _Alloc> &str, unsigned int const version )
{
    boost::archive::library_version_type const library_version{
        ar.get_library_version()
    };

    boost::serialization::item_version_type item_version{ 0 };
    boost::serialization::collection_size_type count;
    ar >> BOOST_SERIALIZATION_NVP( count );

    if ( boost::archive::library_version_type( 3 ) < library_version )
    {
        ar >> BOOST_SERIALIZATION_NVP( item_version );
    }

    str.reserve( count );
    boost::serialization::stl::collection_load_impl( ar, str, count, item_version );
}


template<typename _Archive, typename _T1, typename _T2, typename _Alloc>
inline void serialize( _Archive &ar, boost::interprocess::basic_string<_T1, _T2, _Alloc> &str, unsigned int const version )
{
    boost::serialization::split_member( ar, str, version );
}