关于序列化:把某个对象序列化成字节流

在网络编程中。一个常常的操作是将本地的数据块转换成字符流并将其发送到远端。远端将这个字符串流恢复成数据库。如果有例如以下一个类CObject。编写两个函数,分别将CObject中的成员变量转换为一个字符流(convert2Stream()函数)。并将字符流的数据又一次恢复到一个CObject对象中(convert2Object()函数):

char* convert2Stream(const CObject* vObject);

CObject* convert2Object(const char* vStream);


class CObject

{

private:

int m_NumSample;

std::vector<int> m_Data;

bool m_IsDirty;

}

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <boost/assign/list_of.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/vector.hpp>  

class CObject
{
public:
	CObject() {}
	~CObject() {}

	void printMember() const
	{
		std::cout << "Number " << m_NumSample << "\n";
		std::cout << "vector: ";
		for (int i=0; i<m_Data.size(); ++i)
		{
			std::cout << m_Data[i] << " ";
		}std::cout << std::endl;
		std::cout << "bool " << m_IsDirty << std::endl;
	}

	void setValue(int vNumber, const std::vector<int>& vData, bool vB)
	{
		m_NumSample = vNumber;
		m_Data = vData;
		m_IsDirty = vB;
	}

private:
	friend boost::serialization::access;
	template<typename Archive>
	void serialize(Archive& ar, const unsigned int)
	{
		ar & m_NumSample;
		ar & m_Data;
		ar & m_IsDirty;
	}
private:
	int m_NumSample;
	std::vector<int> m_Data;
	bool m_IsDirty;
};

//*********************************************************************************
//FUNCTION:
char* convert2Stream(const CObject* vObject)
{
	//没有推断vObject的合法性
	std::ostringstream OutStream;
	boost::archive::text_oarchive OArchive(OutStream);
	OArchive << vObject;
	std::string TempString = OutStream.str();
	char *pBuffer = new char[TempString.size()+1];
	memcpy(pBuffer, TempString.c_str(), TempString.size());
	pBuffer[TempString.size()] = ‘\0‘;
	return pBuffer;
}

//*********************************************************************************
//FUNCTION: 要求vStream是以‘\0‘结束
CObject* convert2Object(const char* vStream)
{
	int Length = 0;
	const char *pTemp = vStream;
	while (*pTemp != ‘\0‘)
	{
		++pTemp;
		++Length;
	}
	if (Length == 0) return NULL;
	std::string TempString(vStream, Length);
	std::istringstream InStream(TempString);
	boost::archive::text_iarchive InArchive(InStream);
	CObject* pObject = NULL;//这里要传一个空指针,序列化时会申请内存
	InArchive >> pObject;
	return pObject;
}

int main()
{
	std::vector<int>  TempData = boost::assign::list_of(1)(11)(111)(1111)(11111);
	CObject Obj;
	Obj.setValue(2, TempData, false);
	char *pBuf = convert2Stream(&Obj);
	CObject* pObject = convert2Object(pBuf);
	assert(pObject != NULL);
	pObject->printMember();
	delete[] pBuf;
	delete pObject;//注意内存泄露

	getchar();
	return 0;
}
时间: 2024-07-28 15:19:16

关于序列化:把某个对象序列化成字节流的相关文章

C#对象序列化成XML,以及自定义标签名

C#对象序列化操作: public class XMLHelper { /// <summary> /// 对象序列化成 XML String /// </summary> public static string XmlSerialize<T>(T obj) { string xmlString = string.Empty; XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); //using (Te

.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询.目前已被微软集成于webapi框架之中,因此,熟练掌握JSON.NET相当重要,这篇文章是零度参考官网整理的示例,通过这些示例,可以全面了解JSON.NET提供的功能. Newtonsoft.Json的地址: 官网:http://json.codeplex.com/ 源码地址:https://gi

C#将对象序列化成JSON字符串

public string GetJsonString() { List<Product> products = new List<Product>(){ new Product(){Name="苹果",Price=5.5}, new Product(){Name="橘子",Price=2.5}, new Product(){Name="干柿子",Price=16.00} }; ProductList productlis

ObjC 利用反射和KVC实现嵌套对象序列化成JSON数据

原理: 0.创建一个新的可变字典:NSMutableDictionary 1.采用class_copyPropertyList函数遍历对象的属性 2.property_getName获取属性名,valueForKey获取属性内容. 3.判断该属性内容的Class: (1)假如为基础类型(NSString,NSNumber,NSNull),则直接返回,跳转到4操作. (2)假如为数组类型,先创建新的可变数组,再遍历旧数组中的内容,判断内容类型,重复3进行递归操作,直到找到基础类型.  通过setO

对象序列化成字符串,拼接在请求url后面

使用场景: 前端与后端接口对接的时候, 1.有的接口是query传参(Get请求将参数拼接在请求url后面): http://m.vgcool.cn:10002/api/commodity/GetProductPageList?appId=570&rows=36&page=1&timeStr=1529066356956 2.有的接口是body传参(POST请求参数在请求体中传递) http://m.vgcool.cn:10002/api/commodity/GetProductPa

在.net core 的webapi项目中将对象序列化成json

问题:vs2017 15.7.6创建一个基于.net core 2.1的webapi项目,默认生成的控制器继承自ControllerBase类 在此情况下无法使用Json()方法 将一个对象转成json 解决方案:将控制器继承的类 改为Controller 此时可以使用json()方法 将对象直接转成json. 原文地址:https://www.cnblogs.com/wholeworld/p/9701144.html

jackson2.8.4java对象序列化成json字符串格式化时间

public class User {private int id; private Date birthday; private double money; private String name; public User() { } public User(int id, String name, Date birthday) { super(); this.id = id; this.name = name; this.birthday = birthday; } public User(

C#实体对象序列化成Json,格式化,并让字段的首字母小写

解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性) public class UserInfo { [JsonProperty("id")] public int Id{ set; get; } [JsonProperty("userName")] public string UserName{ set; get; } } 第二种:使用newtonsoft.json来设置格式化的方式(推荐使用)

XML序列化成对象

这个是和ALM上传测试结果结合使用的//把xml序列化成对象以及把对象序列化成xml using System; using System.Data; using System.Configuration; using System.Web; using System.IO; using System.Text; using System.Xml.Serialization; using System.Xml; namespace XMLUtils { /// <summary> /// Su