提升序列化 boost::array 失败
Boost serialize boost::array failed
我正在尝试这个 link 的示例:https://theboostcpplibraries.com/boost.serialization-wrappers
但是直接序列化的例子boost::array编译失败:
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/array.hpp>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
void save()
{
text_oarchive oa{ss};
boost::array<int, 3> a{{0, 1, 2}};
oa << a;
}
void load()
{
text_iarchive ia{ss};
boost::array<int, 3> a;
ia >> a;
std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}
int main()
{
save();
load();
}
部分错误代码如下:
In files included from /usr/local/lib/libboost1.65.1/include/boost/serialization/extended_type_info_typeid.hpp:37:0,
/usr/local/lib/libboost1.65.1/include/boost/archive/detail/oserialzer.hpp:39,
/usr/local/lib/libboost1.65.1/include/boost/archive/detail/interface_oarchive.hpp:23,
/usr/local/lib/libboost1.65.1/include/boost/archive/detail/common_oarchive.hpp:22,
/usr/local/lib/libboost1.65.1/include/boost/archive/basic_text_oarchive.hpp:29,
/usr/local/lib/libboost1.65.1/include/boost/archive/text_oarchive.hpp:31,
from test.cpp:1:
/usr/local/lib/libboost1.65.1/include/boost/serialization/access.hpp: In instantiation of 'static void boost:serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = boost_array<int, 3ul>]':
/usr/local/lib/libboost1.65.1/include/boost/serialization/serialization.hpp:68:69: required from 'void boost:serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = boost_array<int, 3ul>]'
/usr/local/lib/libboost1.65.1/include/boost/serialization/serialization.hpp:126:23: required from 'void boost:serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = boost_array<int, 3ul>]'
..................
test.cpp:15:9: required from here
/usr/include/boost/serialization/access.hpp:116:9: error: 'class boost::array<int, 3ul>' has no member named serialize'
t.serialize(ar, file_version);
^
我的系统配置:
Ubuntu18.04 + 提升 1.65.1
我已经尝试在 lib 路径 /usr/local/lib/libboost1.65.1/ 中手动安装 boost 1.65.1,并且系统在 lib 路径 /usr/lib/x86_64-linux-gnu/ 中安装了 boost 1.65.1。
不幸的是,编译的两个库都因同样的错误而失败。
但是如果boost数组使用封装函数boost::serialization::make_array(),
它将编译正常并工作。
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/array.hpp>
#include <array>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
void save()
{
text_oarchive oa{ss};
std::array<int, 3> a{{0, 1, 2}};
oa << boost::serialization::make_array(a.data(), a.size());
}
void load()
{
text_iarchive ia{ss};
std::array<int, 3> a;
ia >> boost::serialization::make_array(a.data(), a.size());
std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}
int main()
{
save();
load();
}
或者我手动改线
oa << a;
和
ia >> a;
到
oa << boost::serialization::make_array(a.data(), a.size());
和
ia >> boost::serialization::make_array(a.data(), a.size());
编译也OK
全局变量 ss
发出危险信号。以这种方式分享可能会产生意想不到的后果:
- 一方面,可能会残留残留物
- 更微妙的是,在需要时可能不会冲洗。
除此之外,您似乎缺少用于数组序列化的包含:
#include <boost/serialization/boost_array.hpp>
添加它makes it compile,但我们还要修复函数接口以删除全局:
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/array.hpp>
#include <boost/serialization/array.hpp>
#include <boost/serialization/boost_array.hpp>
#include <iostream>
#include <sstream>
std::string save()
{
std::ostringstream ss;
boost::archive::text_oarchive oa{ss};
boost::array<int, 3> a{{0, 1, 2}};
oa << a;
return std::move(ss).str();
}
void load(std::string text)
{
std::istringstream ss(std::move(text));
boost::archive::text_iarchive ia{ss};
boost::array<int, 3> a;
ia >> a;
std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}
int main()
{
auto text = save();
load(text);
}
版画
0, 1, 2
我找到了这个错误的根本原因:
我用的gcc和g++版本太旧了:g++ 4.8.0。
Ubuntu 18.04 中的默认 gcc 和 g++ 版本是 7.5.0
我之所以使用g++ 4.8.0,是因为我想在我的Ubuntu中安装apollo自动驾驶工具包。
然后我也想在我的 Ubuntu 中尝试 LIO-SAM 映射工具包。
但是致命错误出来了,LIO-SAM,以及Boost,gtsam和ROS等依赖项无法通过g ++ 4.8.0编译。
所以要小心你的编译环境。
我正在尝试这个 link 的示例:https://theboostcpplibraries.com/boost.serialization-wrappers
但是直接序列化的例子boost::array编译失败:
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/array.hpp>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
void save()
{
text_oarchive oa{ss};
boost::array<int, 3> a{{0, 1, 2}};
oa << a;
}
void load()
{
text_iarchive ia{ss};
boost::array<int, 3> a;
ia >> a;
std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}
int main()
{
save();
load();
}
部分错误代码如下:
In files included from /usr/local/lib/libboost1.65.1/include/boost/serialization/extended_type_info_typeid.hpp:37:0,
/usr/local/lib/libboost1.65.1/include/boost/archive/detail/oserialzer.hpp:39,
/usr/local/lib/libboost1.65.1/include/boost/archive/detail/interface_oarchive.hpp:23,
/usr/local/lib/libboost1.65.1/include/boost/archive/detail/common_oarchive.hpp:22,
/usr/local/lib/libboost1.65.1/include/boost/archive/basic_text_oarchive.hpp:29,
/usr/local/lib/libboost1.65.1/include/boost/archive/text_oarchive.hpp:31,
from test.cpp:1:
/usr/local/lib/libboost1.65.1/include/boost/serialization/access.hpp: In instantiation of 'static void boost:serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = boost_array<int, 3ul>]':
/usr/local/lib/libboost1.65.1/include/boost/serialization/serialization.hpp:68:69: required from 'void boost:serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = boost_array<int, 3ul>]'
/usr/local/lib/libboost1.65.1/include/boost/serialization/serialization.hpp:126:23: required from 'void boost:serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive; T = boost_array<int, 3ul>]'
..................
test.cpp:15:9: required from here
/usr/include/boost/serialization/access.hpp:116:9: error: 'class boost::array<int, 3ul>' has no member named serialize'
t.serialize(ar, file_version);
^
我的系统配置: Ubuntu18.04 + 提升 1.65.1
我已经尝试在 lib 路径 /usr/local/lib/libboost1.65.1/ 中手动安装 boost 1.65.1,并且系统在 lib 路径 /usr/lib/x86_64-linux-gnu/ 中安装了 boost 1.65.1。 不幸的是,编译的两个库都因同样的错误而失败。
但是如果boost数组使用封装函数boost::serialization::make_array(), 它将编译正常并工作。
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/array.hpp>
#include <array>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
void save()
{
text_oarchive oa{ss};
std::array<int, 3> a{{0, 1, 2}};
oa << boost::serialization::make_array(a.data(), a.size());
}
void load()
{
text_iarchive ia{ss};
std::array<int, 3> a;
ia >> boost::serialization::make_array(a.data(), a.size());
std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}
int main()
{
save();
load();
}
或者我手动改线
oa << a;
和
ia >> a;
到
oa << boost::serialization::make_array(a.data(), a.size());
和
ia >> boost::serialization::make_array(a.data(), a.size());
编译也OK
全局变量 ss
发出危险信号。以这种方式分享可能会产生意想不到的后果:
- 一方面,可能会残留残留物
- 更微妙的是,在需要时可能不会冲洗。
除此之外,您似乎缺少用于数组序列化的包含:
#include <boost/serialization/boost_array.hpp>
添加它makes it compile,但我们还要修复函数接口以删除全局:
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/array.hpp>
#include <boost/serialization/array.hpp>
#include <boost/serialization/boost_array.hpp>
#include <iostream>
#include <sstream>
std::string save()
{
std::ostringstream ss;
boost::archive::text_oarchive oa{ss};
boost::array<int, 3> a{{0, 1, 2}};
oa << a;
return std::move(ss).str();
}
void load(std::string text)
{
std::istringstream ss(std::move(text));
boost::archive::text_iarchive ia{ss};
boost::array<int, 3> a;
ia >> a;
std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}
int main()
{
auto text = save();
load(text);
}
版画
0, 1, 2
我找到了这个错误的根本原因: 我用的gcc和g++版本太旧了:g++ 4.8.0。 Ubuntu 18.04 中的默认 gcc 和 g++ 版本是 7.5.0
我之所以使用g++ 4.8.0,是因为我想在我的Ubuntu中安装apollo自动驾驶工具包。 然后我也想在我的 Ubuntu 中尝试 LIO-SAM 映射工具包。 但是致命错误出来了,LIO-SAM,以及Boost,gtsam和ROS等依赖项无法通过g ++ 4.8.0编译。
所以要小心你的编译环境。