通常对于这些错误,在Ubuntu系统下一般可以通过sudo apt-get install libboost-all-dev全部解决,但不一定行得通 。
(2)安装成功后,如果未指定安装位置,那么默认将会安装到/usr/local/lib和/usr/local/include下,那么我们在使用Boost库进行编译时就需要使用-L和-I参数加上具体的lib和include路径,像下面这样:
g++ -o test boost_test.cpp -I$BOOST_INCLUDE -L$BOOST_LIB -lboost_serialization
如果觉得每次都这样很麻烦,那么可以将我们所要用到的lib和include文件加入到环境变量中,像下面这样:
sudo cp /usr/local/lib/libboost_serialization.* /usr/lib
sudo cp -r /usr/local/include/boost /usr/include
然后在编译时直接g++ -o test boost_test.cpp -lboost_serialization即可 。
注意:boost下面有两个序列化lib文件:ibboost_serialization.lib 和 libboost_wserialization.lib,那么这两者有什么区别呢?
其实'w' 表示使用的是宽字符,例如 wchar_t 。
(3)boost不尽人意的地方
基本类型指针很难序列化,例如int *array,官网上是这么说的:
By default, data types designated primitive by Implementation Levelclass serialization trait are never tracked. If it is desired totrack a shared primitive object through a pointer (e.g. along used as a reference count), It should be wrappedin a class/struct so that it is an identifiable type.The alternative of changing the implementation level of alongwould affect alllongs serialized in the wholeprogram - probably not what one would intend.
也就是说如果你想序列化原生类型的指针,需要给其加上struct或class使其变为类类型再序列化,可见有些麻烦,这样的需求往往也很频繁,鉴于序列化机制的实现原理,boost库暂时还不能很好的支持基本类型的指针序列化 。
不能序列化变长数组(variable-sized array),会报错说变长数组不是模板类类型 。
(4)如果需要定义一个对象数组,如定义含有2个元素的class A对象数组,那么必须用A a[2]定义而不能用对象的指针A *a = new A[2]定义,这样序列化a后默认当作一个A对象处理,因此只能存储一个对象的值,后面的不会存储 。
(5)所谓boost很人性的非侵入性质也有一定的条件:如果不想改动原来的类,那么原来的类属性必须是public的,这很容易解释,因为你必须 要能在别处访问到这些属性并定义其序列化方式,当然这也在其它地方暴露了类的结构,具有一定的劣势 。这样的条件往往很难满足,因为我们定义的类属性一般都 是private的,如果是这样,且仍想要使用非侵入性质,那么需要在类中添加以下声明来开放访问给 serialization 库:
friend class boost::serialization::access;
这样的方式比让成员public更好 。
推荐阅读
- 这么好用的Excel技巧赶紧进来看看
- 淘宝选词工具 选词助手免费使用的吗
- Linux常用的10个性能检测命令!
- 淘宝免费选词工具 选词助手免费使用的吗
- 选词助手免费使用的吗 淘宝选词工具
- 适合春天饮用的8种花茶,花茶不只是女人专属
- 几款适合年轻人饮用的茶品推荐
- 胎菊与杭白菊的区别有哪些,常用的花草茶有哪些
- 选词助手免费使用的吗 淘宝免费选词工具
- 超管用的润喉茶,牛蒡茶的副作用
