您当前的位置: 首页 >  c++

插件开发

暂无认证

  • 1浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

boost 序列化-C++-serialization-支持常用STL-内存数据文件持久化-继承序列化

插件开发 发布时间:2022-06-27 08:35:16 ,浏览量:1

文章目录
    • 1.序列化函数库
    • 2.DrawObject.h文件
    • 3.DrawObject.cpp文件
    • 4.子类.h文件
    • 5.子类.cpp文件
    • 6.读者答疑

1.序列化函数库

在C++编程中,一个常用的操作是保存数据到文件,用于下次加载时使用,为达到这一目的,boost库提供了序列化的库供使用,源代码如下所示:

#include "boost/serialization/serialization.hpp"
#include "boost/archive/binary_oarchive.hpp"
#include "boost/archive/binary_iarchive.hpp"
#include "boost/foreach.hpp"
#include "boost/any.hpp"
#include "boost/serialization/vector.hpp"
#include "boost/serialization/list.hpp"
#include "boost/serialization/deque.hpp"
#include "boost/serialization/string.hpp"
#include "boost/serialization/split_free.hpp"
#include "boost/serialization/base_object.hpp"
#include "boost/serialization/access.hpp"
#include "boost/serialization/version.hpp"
#include "boost/serialization/export.hpp"
#include "boost/archive/text_iarchive.hpp"
#include "boost/archive/text_oarchive.hpp"

class class1
{
	//序列数据
	friend class boost::serialization::access;
	template//序列化函数
	void serialize(Archive& ar,const unsigned int version)
	{
		ar&m_filename;
		if(Archive::is_loading::value)//加载数据
		{
			ar&m_ANormalLabelSizeMap;
			std::map::iterator it=m_ANormalLabelSizeMap.begin();
			for (;it!=m_ANormalLabelSizeMap.end();it++)
			{
				//创建对象加载数据
				ANormalLabelSize* pANormalLabelSize=new ANormalLabelSize;
				ar&(pANormalLabelSize);
				it->second = pANormalLabelSize;
			}
		}
		if(Archive::is_saving::value)
		{
			ar&m_ANormalLabelSizeMap;
			std::map::iterator it=m_ANormalLabelSizeMap.begin();
			for (;it!=m_ANormalLabelSizeMap.end();it++)
			{
				ar&(*(it->second));//保存对象数据
			}
		}
	}
}

父类和子类序列化,源代码如下所示:

2.DrawObject.h文件
// ODShape.h: interface for the CShape class.
//
//

#if !defined(AFX_ODShape_H__125A1B30_9A77_4C4D_9B48_894687D03BEC__INCLUDED_)
#define AFX_ODShape_H__125A1B30_9A77_4C4D_9B48_894687D03BEC__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "gdiplus.h"
#include 
#include "GeometryCompute.h"
#include 
#include "GDIPlusSerialization.h"

//对象类型
enum DrawObjectType
{
	ObjectType_UnKnow,
	ObjectType_Pointer,
	ObjectType_Rectangle,
	ObjectType_Line,
	ObjectType_PolyLine,
	ObjectType_Polygon,
	ObjectType_Rotation,
	ObjectType_Text,
	ObjectType_Image,
	ObjectType_PolygonCrop,
	NumberOfDrawObjectTypes
} ;	

class DrawObject
{
public:
	DrawObject ();
	virtual ~DrawObject ();

public:
	//对象名称
	std::string m_DrawObjectName;//对象ID

	//画笔
	Gdiplus::Color m_PenColor;
	float m_PenWidth;
	int m_PenType;

	//画刷
	Gdiplus::Color m_FillColor;
	bool m_Filled;
	int m_BrushType;

	//状态属性
	Gdiplus::PointF m_Center;
	std::string m_TipText;
	unsigned MID;
	bool m_Dirty;
	int m_Id;
	int m_ZOrder;
	float m_Rotation;	
	bool m_bIsDrawCenterPoint;
	int m_ConnectionCount;
	bool m_Selected;
	bool m_bIsImage;
	int m_HandleCount;

	//微调
	float m_Step;
	bool m_IsCreated;

	//对象类型名
	DrawObjectType m_ObjectType;

	//绘制模式 0代表正常绘图 1代表只绘制关键点
	int m_DrawMode;

public:
	//序列数据
	friend class boost::serialization::access;
	template//序列化函数
	void serialize(Archive& ar,const unsigned int version)
	{
		//对象名称
		ar&BOOST_SERIALIZATION_NVP(m_DrawObjectName);

		//画笔
		ar&BOOST_SERIALIZATION_NVP(m_PenColor);
		ar&BOOST_SERIALIZATION_NVP(m_PenWidth);
		ar&BOOST_SERIALIZATION_NVP(m_PenType);

		//画刷
		ar&BOOST_SERIALIZATION_NVP(m_FillColor);
		ar&BOOST_SERIALIZATION_NVP(m_Filled);
		ar&BOOST_SERIALIZATION_NVP(m_BrushType);

		//状态属性
		ar&BOOST_SERIALIZATION_NVP(m_Center);
		//ar&m_Center;
		ar&BOOST_SERIALIZATION_NVP(m_TipText);
		ar&BOOST_SERIALIZATION_NVP(MID);
		ar&BOOST_SERIALIZATION_NVP(m_Dirty);
		ar&BOOST_SERIALIZATION_NVP(m_Id);
		ar&BOOST_SERIALIZATION_NVP(m_ZOrder);
		ar&BOOST_SERIALIZATION_NVP(m_Rotation);
		ar&BOOST_SERIALIZATION_NVP(m_bIsDrawCenterPoint);
		ar&BOOST_SERIALIZATION_NVP(m_ConnectionCount);
		ar&BOOST_SERIALIZATION_NVP(m_Selected);
		ar&BOOST_SERIALIZATION_NVP(m_bIsImage);
		ar&BOOST_SERIALIZATION_NVP(m_HandleCount);

		//微调
		ar&BOOST_SERIALIZATION_NVP(m_Step);
		ar&BOOST_SERIALIZATION_NVP(m_IsCreated);
	}
};

BOOST_SERIALIZATION_ASSUME_ABSTRACT(DrawObject);

typedef std::list ShapeList;
typedef ShapeList::iterator ShpIt;
typedef ShapeList::const_iterator ConShpIt;
#endif // !defined(AFX_ODShape_H__125A1B30_9A77_4C4D_9B48_894687D03BEC__INCLUDED_)

3.DrawObject.cpp文件
// ODShape.cpp: implementation of the CShape class.
//
//
#include "stdafx.h"
#include "DrawObject.h"
#include 
#include "CADControl.h"
#include "GeometryCompute.h"
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include "MyLogger.h"

using namespace Gdiplus;

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
					
#define ABGR(a,r,g,b)  ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))            
关注
打赏
1665481431
查看更多评论
0.0413s