`

使用数组来实现类的序列化, boost

 
阅读更多
根据官方文档改写:
http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/tutorial.html#arrays

http://www.fuzhijie.me/?p=62


#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <iostream>
#include <exception>
#include <assert.h>
#include <fstream>

//include headers that implement a archive in simple text format
#include "boost/archive/text_oarchive.hpp"
#include "boost/archive/text_iarchive.hpp"
#include "boost/archive/binary_iarchive.hpp"
#include "boost/archive/binary_oarchive.hpp"
#include "boost/serialization/vector.hpp"
#include "boost/serialization/string.hpp"
#include "boost/iostreams/stream.hpp"

#pragma command(lib, "boost_serialization-vc100-mt-1_48.lib")
#pragma command(lig, "boost_iostreams-vc100-mt-1_48.lib");
using namespace std;


/////////////////////////////////////////////////////////////
// gps coordinate
//
// illustrates serialization for a simple type
//
typedef struct gps_struct
{
	char name[100];
	char data[2][100];
	string version;
	int id;
}gps_struct;

class gps_position
{
public:
// 	friend class boost::serialization::access;
// 	// when the class Archive corresponds to an output archive, the
// 	// & operation is defined similar to <<, Likewise, when the class Archive 
// 	// is a type of input archive the  & operator is defined similar to >>.
// 	template<class Archive>
// 	void serialize(Archive &ar, const unsigned int version)
// 	{
// 		ar & degrees;
// 		ar & minutes;
// 		ar & seconds;
// 	}
	int degrees;
	int minutes;
	float seconds;
	vector<string> hellos;
	gps_struct time;
public:
	gps_position(){};
	gps_position(int d, int m, float s) :
	degrees(d), minutes(m), seconds(s)
	{
		hellos.push_back("test1");
		hellos.push_back("test2");
		hellos.push_back("test3");
		strcpy(time.name, "Kevin He");
		time.version = "1.0";
		time.id =100;
		strcpy(time.data[0], "time1");
		strcpy(time.data[1], "time2");


	}
};


namespace boost {
	namespace serialization {

		template<class Archive>
		void serialize(Archive & ar, gps_struct & g, const unsigned int version)
		{
			ar & g.id;
			ar & g.name;
			ar & g.version;
			ar & g.data;
		}

		template<class Archive>
		void serialize(Archive & ar, gps_position & g, const unsigned int version)
		{
			ar & g.degrees;
			ar & g.minutes;
			ar & g.seconds;
			ar & g.hellos;
			ar & g.time;
		}

	} // namespace serialization
} // namespace boost


int _tmain(int argc, _TCHAR* argv[])
{
	//create and open a character archive for output
	std::ofstream ofs("filename");
	const gps_position g(35, 59, 24.57);

	//save data to archive
	char buffer[4096];
	int bufferSize = 4096;
	string mydata;
	{
		//boost::archive::text_oarchive oa(ofs);		
		memset(buffer, 0, bufferSize);
		boost::iostreams::basic_array<char> sr(buffer, bufferSize);
		boost::iostreams::stream< boost::iostreams::basic_array<char> > source(sr);
		boost::archive::text_oarchive oa(source);

		//write class instance to archive
		oa << g;
		//archive and stream closed when destructors are called;
	}

	gps_position newg;
	{
		//std::ifstream ifs("filename");
		//boost::archive::text_iarchive ia(ifs);

		// read class state from archive
		boost::iostreams::basic_array<char> sr(buffer, bufferSize);
		boost::iostreams::basic_array<char> temp(buffer, bufferSize);
		boost::iostreams::stream< boost::iostreams::basic_array<char> > newsource(temp);
		boost::archive::text_iarchive ia(newsource);
		ia >> newg;
	}

	// ... some time late restore the class instance to its orginal state 
	return 0;
}
分享到:
评论

相关推荐

    boost_1_34_0的包含文件(boost目录下的全部文件)

    9. **Serialization**:`boost.serialization`库提供了序列化和反序列化机制,使得数据可以保存和恢复到/从文件或流中。 10. **Regex**:`boost.regex`库提供了正则表达式支持,比C++标准库中的`&lt;regex&gt;`更强大,更...

    boost源码库

    4. **容器**:Boost库中的`multi_array`和`array`提供了一种更灵活的数组实现,而`fusion`库则为元编程提供了高级容器支持。 5. **迭代器**:Boost.Iterator库提供了一些增强的迭代器,如`filter_iterator`、`...

    C++准标准库Boost介绍

    6. **输入输出**:如Assign简化赋值操作,Filesystem管理文件系统,Format实现格式化输出,locale_state_savers处理本地化状态,Serialization实现序列化和反序列化,以及日期时间处理库Date_time。 7. **综合工具*...

    boost库开发文档

    8. **序列化库**:Boost.Serialization使得C++对象的状态可以被序列化和反序列化,便于持久化存储或网络传输。 9. **类型识别与转换**:如boost::type_traits和boost::enable_if,用于编译时类型检查和转换。 10. ...

    boost文档中文版

    13. **序列化**:`serialization`库允许将对象的状态序列化到文件或内存流中,以便保存和恢复。 通过深入学习Boost中文版文档,程序员不仅可以了解如何利用这些库来提高代码质量,还可以学习到C++的最佳实践和设计...

    boost_1_44_0

    9. **序列化库**:`serialization`库允许将对象的状态保存到文件并恢复,支持XML和二进制格式。 10. **数学和统计**:`math`库提供了许多数学函数,包括统计学、随机数生成、特殊函数等。 11. **字符串处理**:`...

    hugin文件boost_1_39_0.7z

    8. **类型转换与序列化**:Boost.Conversion和Boost.Serialization库帮助Hugin实现了不同类型间的转换以及数据的持久化存储。 总之,Boost库在Hugin中的应用,大大增强了其功能和性能,使得Hugin能够高效地处理大量...

    C++标准库Boost程序库导论

    - **Lexical_cast**: 能够在字符串和其他基本类型之间进行转换,非常适用于序列化和反序列化操作。 #### Library3: Utility **Utility**库包含了大量实用工具,用于解决日常编程中的常见问题。 - **BOOST_STATIC_...

    boost_1_41_文档_中文版

    10. **序列化库**(Serialization):使得对象的状态可以被保存和恢复,便于持久化和数据交换。 通过阅读这份中文版的文档,开发者不仅可以理解Boost库的各个组件,还能学习到C++编程的最佳实践。对于C/C++开发者来...

    Boost.orgrandommodule.zip

    3. **种子序列(Seed Sequences)**:为了确保随机数序列的可重复性和不可预测性,Boost.Random提供了种子序列类。例如,你可以使用当前时间、系统计数器等作为种子,以生成不同的随机数序列。种子序列可以与随机数...

    boost_1_64_0-src.zip

    5. **日期和时间库**(Boost.Date_Time):提供了处理日期和时间的类和函数,包括日期格式化、日期时间的计算和比较。 6. **正则表达式库**(Boost.Regex):实现了强大的正则表达式引擎,支持Unicode字符集。 7. ...

    使用Boost设计坚固的对象

    Boost库还包括了如Boost.Serialization用于序列化和反序列化,Boost.Python用于C++与Python之间的互操作,以及Boost.Thread库提供了线程管理和同步原语,这些都是构建大规模、多线程应用程序的重要工具。 总结来说...

    Boost C++ Libraries (MinGW):Boost C ++库(MinGW)-开源

    10. **序列化**:Boost.Serialization库支持将C++对象序列化为XML或二进制格式,便于存储和恢复。 11. **图形用户界面**:Boost.Graphical User Interface(Boost.GUI)虽然不是标准Boost库的一部分,但是一些社区...

    通讯录c++源代码

    这通常涉及到序列化和反序列化过程,例如使用`fstream`类读写文本文件,或者使用更高级的序列化库如Boost.Serialization。 此外,为了提高用户体验,可以考虑添加命令行界面或图形用户界面(GUI)。对于命令行界面...

    C++实现string存取二进制数据的方法

    例如,从网络读取二进制数据到char数组后,应使用数组的长度来初始化string对象,像这样: ```cpp char data[max_length]; size_t length = sockClient.read_some(boost::asio::buffer(data), ec); string strData...

    Boost C++ Libraries,提供免费的、可移植的同行评审的 C++ 库

    - `scoped_thread`:智能指针实现的线程类,确保线程在不再使用时被正确销毁。 5. **算法**: - `algorithm`:包含多种扩展的算法,如排序、搜索、比较等,与标准库算法相辅相成。 - `functional`:提供高阶函数...

    json解析器源码

    3. **序列化(Serialization)**:与解析相对,序列化是指将内部数据结构转换回JSON字符串。这对于保存或发送数据非常有用。 4. **错误处理(Error Handling)**:在解析过程中,可能会遇到无效的JSON或者语法错误...

    Mefang_Vc_

    在C++中,可以自定义序列化和反序列化方法,或者利用现有库如Boost.Serialization来实现。 六、错误处理与调试 任何程序都需要考虑异常处理和调试机制。在这个魔方程序中,可能有检查非法旋转操作、矩阵越界访问等...

    jsoncpp (很好用的C++ Json解析器)

    3. **序列化和反序列化**:用户可以通过`Json::Value`对象的`toStyledString()`方法将JSON数据转换为可读性强的字符串,也可以使用`Json::Reader`类从JSON字符串中构建`Json::Value`对象,实现数据的反序列化。...

    向文件写结构体,或从文件读取结构体 VC

    对于这种情况,可以重载`和`&gt;&gt;`运算符来实现流式输入输出,或者使用`boost::serialization`等库进行高级序列化操作。 总结,VC++中向文件写入结构体和从文件读取结构体主要涉及`fstream`库的使用,通过`write`和`...

Global site tag (gtag.js) - Google Analytics