做了一回boost::xml_serialization的小白

  

  年前一直为车票发愁,还要赶在放假之前把现在开发的东东封一个版本,真的很累,BT的研究放下两天了,最近又下了几个关于BT的库,正在看,BT的tracker真得挺有意思的,一定要把他搞清楚,不知道还有什么方法能够提高P2P的传输速度......,谁有好主意分享一下。

今天利用编版本的时间研究了一下boost的序列化,特别是xml序列化的东东,还是有很多收获,记下来怕以后忘记了,人老了,很多东东都记不得了......

(一)研究boost库xml序列化要做准备的工作

a.下一个最新的boost库记住用1.32版本的,这个版本提供了XML序列化的支持

b.windows下用的VC7.0,这个是一定要了,我一直没舍得换我的VC6,结果编译boost的serialization的库用了很多毛招就是编不过,实在没办法了,只好老老实实装了VC7,原因是VC6对模版类的支持不好,比GCC差得很远,VC7要强很多了......其实VC7也是挺好用的。

c.打开boost/libs/serialization/vc7ide下的工程文件,然后编lib就行了

d.做一个新工程作测试用我的叫xmlser

e.记得一定要把工程的RTTI的支持选上,我就是因为这个没选,挠了半天的脑袋,具体设置property page->C/C++->Language->Enable Run-Time Type Info一定要选上(Yes),我就是没注意这个,结果在我序列化std::vector< int > ints; 的时候死要dynamic_cast<T*>上了,有兴趣的可以到MSDN上看一看关于RTTI的文档,这些都准备好就可写测试代码了。

(二)boost的xml序列化的测试代码

最好在做这部之前看看boost提供的助部份的文档,而且最好看看boost/libs/serialization/example下的例子程序,不过我建议最好不要直接用这部份代码做试验,一是比较复杂,二是你会不太了解其中的实现细节,下面就是一步步写得测试代码

// xmlser.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <fstream>
#include <boost/serialization/vector.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#pragma comment(lib,"libboost_serialization.lib")
class test
{
public:
test()
: mvalue(-1)
{
}
template< class archive >
void serialize( archive &ar , unsigned int filever )
{
ar & BOOST_SERIALIZATION_NVP(mvalue);
}
int mvalue;
};
int _tmain(int argc, _TCHAR* argv[])
{
/**
* save archive
*/
{
std::vector< int > ints;
test* a = new test;
ints.push_back( 100 );
ints.push_back( 200 );
std::ofstream ofs("test.xml");
boost::archive::xml_oarchive oa(ofs);
int nvalue = 106;
oa << BOOST_SERIALIZATION_NVP(nvalue);
oa << BOOST_SERIALIZATION_NVP(ints);
oa << BOOST_SERIALIZATION_NVP(a);
delete a;
}
/**
* load from archive
*/
{
std::vector< int > ints;
std::ifstream ofs("test.xml");
boost::archive::xml_iarchive oa(ofs);
int nvalue = 0;
test* a = NULL;
oa >> BOOST_SERIALIZATION_NVP(nvalue);
oa >> BOOST_SERIALIZATION_NVP(ints);
oa >> BOOST_SERIALIZATION_NVP(a);
for( std::vector< int >::iterator i = ints.begin() ; i != ints.end() ; i++ )
{
printf("the value of vector %d/n",*i);
}
}
return 0;
}
这里要说明的就是如果你想使用std::vector等STL容器的序列化一定要包括#include <boost/serialization/vector.hpp>这句话,因为这个文件定义了template<class Archive, class Allocator>
inline void serialize(
Archive & ar,
STD::vector<bool, Allocator> & t,
const unsigned int file_version
){
boost::serialization::split_free(ar, t, file_version);
}

这样一个模版函数,这就是这个文件的主要作用。有了这个文件你就会发现boost和stl合作做序列化是一件多么让人愉快的事情啊,呵呵,boost库真的很好用啊,快点儿成为标准吧......。

另外关于序列化东东,这里用了一个宏BOOST_SERIALIZATION_NVP,感兴趣的可以看看宏展开是什么,xml_serialization序列化是一个pair,原因很简单,XML结点肯定需要一个结点的名字,和结点的值对吧,所以这个宏让你可以直接用你想序列化的对象生成一个叫NVP的对象,你可以不用这个宏直接写,写成下面的形式也是可以的oa >> boost::serialization::make_nvp("vector",ints);这样可以指定你想要结点名字我个人觉得这样可能会更有用一些。

关于类的序列化要最基本要有一个

template< class archive >
void serialize( archive &ar , unsigned int filever )
{
ar & BOOST_SERIALIZATION_NVP(mvalue);
}

这样的模版函数,因为最后编译完所有的序列化实现都会经过这个函数。我试了一个对象的序列化发现boost真是太好了

test* a = NULL;
oa >> BOOST_SERIALIZATION_NVP(nvalue);
oa >> BOOST_SERIALIZATION_NVP(ints);
oa >> BOOST_SERIALIZATION_NVP(a);

boost用判断对象指针为空调用load_pointer为你生成一个对象有了这个功能真是太方便了,我跟踪了一下实现代码#@%^&*,展开的名字太长了有两个地方是实现这个功能的主要部份一个是register_type,还有就是那个ar.load_pointer,没有时间了,要休息了明天还有封版本,只能做到这里了,有兴趣的朋友可以试一下boost的代码还是很好看懂的,把这部份都搞清了就成范型高手了......明天继续。

 

<think>好的,我现在遇到了一个关于Boost.Serialization的编译错误,具体是`boost::serialization::library_version_type`导致的“does not name a type”错误。我需要解决这个问题,首先得弄清楚错误的原因。 首先,用户提到错误信息是`'boost::serialization::library_version_type' does not name a type`。这说明编译器在查找这个类型时失败了。可能的原因有几个: 1. **头文件未包含**:可能没有包含必要的Boost.Serialization文件Boost库中的很多功能需要显式包含特定的头文件,特别是序列化相关的功能可能需要`boost/archive/text_oarchive.hpp`或者`boost/serialization/library_version_type.hpp`之类的头文件。 2. **命名空间错误**:虽然用户写的是`boost::serialization::library_version_type`,但有可能这个类型实际上位于另一个命名空间下,比如`boost::archive`。需要查阅Boost的文档确认正确的命名空间。 3. **Boost版本问题**:`library_version_type`可能是在较新的Boost版本中引入的,如果用户使用的是旧版本,可能没有这个类型。检查Boost的版本是否符合要求。 4. **序列化宏未正确使用**:如果在序列化类时没有正确使用BOOST_SERIALIZATION_SPLIT_MEMBER或其他相关宏,可能导致类型未正确声明。 接下来,我需要逐步验证这些可能性。首先,确保用户包含了正确的头文件。查阅Boost的文档,发现`library_version_type`确实属于`boost::serialization`命名空间,但可能需要包含`<boost/serialization/library_version_type.hpp>`头文件。不过,实际上在常见的序列化操作中,可能不需要直接包含这个头文件,而是通过其他头文件间接引入。例如,使用`boost/archive/text_oarchive.hpp`时会自动包含相关类型。 另外,检查Boost的版本。如果用户使用的是Boost 1.73或更高版本,`library_version_type`才被引入。如果版本过低,编译器自然找不到这个类型。用户需要升级Boost到至少1.73版本。 此外,检查代码中是否有拼写错误,比如命名空间或类型名的拼写错误。比如是否写成了`library_version_type`而不是其他类似的名字。 可能的解决步骤包括: 1. 包含必要的头文件,例如`#include <boost/serialization/library_version_type.hpp>`。 2. 检查Boost版本,确保其支持该类型。 3. 确认代码中的命名空间和类型名称正确无误。 4. 如果使用序列化宏,确保正确使用,如`BOOST_SERIALIZATION_SPLIT_MEMBER()`等。 另外,根据用户提供的引用内容,比如引用[4]提到CMake帮助管理外部库,可能需要检查项目的构建配置是否正确链接了Boost.Serialization库,确保CMake能够找到正确的Boost版本和组件。 最后,如果用户在使用Vcpkg安装Boost,可能需要重新安装或更新Boost库,确保安装的版本包含所需的类型。引用[3]中提到的Vcpkg安装CGAL,类似的方法可能适用于Boost的安装。</think>关于`boost::serialization::library_version_type`的编译错误“does not name a type”,以下是分步解决方案: ### 1. 检查头文件包含 确保代码中包含以下头文件: ```cpp #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/serialization/library_version_type.hpp> // 显式包含 ``` `library_version_type`可能需要显式包含其头文件,尤其是在较新的Boost版本中[^1]。 ### 2. 确认Boost版本 `library_version_type`在**Boost 1.73及以上版本**引入。通过以下命令检查版本: ```bash grep "#define BOOST_VERSION" /path/to/boost/version.hpp ``` 若版本低于1.73,需升级Boost: - **Vcpkg用户**:运行`vcpkg install boost --triplet=x64-windows`更新[^3]。 - **源码用户**:下载最新版本并重新编译。 ### 3. 验证命名空间和类型名称 确认代码中未混淆命名空间。例如: ```cpp // 正确用法 boost::serialization::library_version_type version; ``` 而非`boost::archive::library_version_type`。 ### 4. 检查序列化宏的使用 在序列化类时,需正确使用宏声明: ```cpp #include <boost/serialization/access.hpp> class MyClass { private: friend class boost::serialization::access; template<class Archive> void serialize(Archive& ar, const unsigned int version) { ar & data; } int data; }; ``` 若使用拆分序列化(save/load),需添加`BOOST_SERIALIZATION_SPLIT_MEMBER()`[^1]。 ### 5. 配置CMake确保正确链接 在`CMakeLists.txt`中,确保包含Boost.Serialization组件: ```cmake find_package(Boost REQUIRED COMPONENTS serialization) target_link_libraries(YourProject PRIVATE Boost::serialization) ``` 通过CMake管理依赖可避免路径问题[^4]。 ### 6. 重新生成构建环境 若使用Vcpkg或源码安装Boost后,需清理并重新生成构建缓存: ```bash rm -rf build/ && mkdir build && cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=[vcpkg路径]/scripts/buildsystems/vcpkg.cmake make ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值