我有一个结构实例,通过Boost进程传递给TCP / IP客户端,在客户端我需要使用Boost序列化库对其进行序列化。由于这个结构包含boost :: interprocess basic_string,它不能直接串行化,所以我通过使用它们来构建序列化函数中的std :: string'来解决这个问题。
nth-of-type
如果没有构造函数开销,有没有更好的方法呢?
答案 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 );
}