序列化的作用

前言:

本文以C++语言作为讲解序列化的作用。

序列化是什么?

一般说到序列化,其实是包含了反序列化。

以C++为例,序列化就是将结构体(或者是类)等复杂的数据结构的各个属性有序地保存到字符数组。而反序列化就是将有序的字符数组还原回结构体(或者是类)等复杂的数据结构。

序列化作用

1、方便网络传输

我们都知道,socket的数据都是以字符串进行传输,而序列化的作用就是将复杂的数据结构转换成字符串。

2、方便协议解释

序列化中的“序”就是有序的意思,有序的字符串序列可以供绝大多数的编程语言解释。而Protocol Buffers就是其中的突出代表。

3、方便数据存储

方便数据存储这个好理解,就是解决一对多的问题。不用序列化可能需要存储多条信息,而序列化可以将多条数据合成一条进行存储;方便数据运维。

序列化也是一把双刃剑,优点明显,缺点同样明显!

序列化的不足

1、性能

不是说序列化效率低下,而是人为在序列化上效率控制上。以在windows(VS2013)下为例,当我们对结构体进行赋值时,当结构体字节小于等于4096时,编译器会将结构体每个值进行一一赋值(这里的值不是真正结构的值,相对汇编来说是4个字节);当结构体字节大于4096时,编译器会直接调用memcpy。这是因为一一赋值的效率会随着字节数的增大而大幅下降。

2、存储数据不易修改

假如现在数据库保存的是a、b、c三个值的序列化的字符串。但是现在需求发生变化,需要加入d值。那就麻烦了,因为现在要考虑旧数据的兼容问题了。

对于性能问题,只能加强自身能力来确保性能的最大化。而对于存储数据,我的建议加入一个版本号,对这个版本号的不同做一些数据兼容。

我已经将我自己写的序列化代码放到github : https://github.com/XJM2013/Serializer 有兴趣的可以看看。下面贴出测试代码,及测试结果。

#ifndef TEST_SERIALIZER_H
#define TEST_SERIALIZER_H

#include <vector>
#include "serializer.h"

namespace TestSerializer
{
	class TestData
	{
	public:
		TestData(){};
		~TestData(){};

		bool		Serialize(Serializer &stream) const;
		bool		Unserialize(Serializer &stream);

		struct DataStruct
		{
			int a;
			short b;
			char c;
			char d;
			long long e;
			float f;
			double g;
		};

		DataStruct m_data_struct;
		typedef std::vector<int> VECTOR_TEST;
		typedef std::vector<std::string> VECTOR_NAME;

		VECTOR_TEST role_data;
		VECTOR_NAME role_name;
	};

	bool TestData::Serialize(Serializer &stream) const
	{
		stream.Push(m_data_struct);
		stream.Push(role_data.size());
		for (VECTOR_TEST::const_iterator itr = role_data.begin(); itr != role_data.end(); ++itr)
		{
			stream.Push((*itr));
		}

		stream.Push(role_name.size());
		for (VECTOR_NAME::const_iterator itr = role_name.begin(); itr != role_name.end(); ++itr)
		{
			stream.PushStr(itr->c_str(), itr->length() + 1);
		}
		return true;
	}

	bool TestData::Unserialize(Serializer &stream)
	{
		stream.Pop(m_data_struct);
		unsigned int size = 0;
		stream.Pop(size);
		int data = 0;
		for (unsigned int i = 0; i < size; ++i)
		{
			stream.Pop(data);
			role_data.push_back(data);
		}

		stream.Pop(size);
		char *str = 0;
		unsigned int length = 0;
		bool ret = false;
		for (unsigned int i = 0; i < size; ++i)
		{
			ret = stream.PopStr(&str, length);
			if (!ret)
			{
				return ret;
			}
			role_name.push_back(str);
		}
		return true;
	}

	void Normal()
	{
		TestData src_data;
		TestData des_data;

		src_data.m_data_struct.a = 11;
		src_data.m_data_struct.b = 22;
		src_data.m_data_struct.c = 33;
		src_data.m_data_struct.d = 44;
		src_data.m_data_struct.e = 55;
		src_data.m_data_struct.f = (float)66.6;
		src_data.m_data_struct.g = -77.7;

		src_data.role_data.push_back(88);
		src_data.role_data.push_back(99);

		src_data.role_name.push_back("xian");
		src_data.role_name.push_back("jia");
		src_data.role_name.push_back("ming");

		// src_data and des_data will be the same
		char data[1024] = { 0 };
		Serializer temp1(data, 1024);
		src_data.Serialize(temp1);

		Serializer temp2(data, 1024);
		des_data.Unserialize(temp2);
	}
}

#endif

断点查看结果:



时间: 2024-10-14 11:25:17

序列化的作用的相关文章

Java序列化的作用

很多人都认为Java序列化的作用有以下两方面: 1) 把对象的字节序列永久地保存到硬盘上(通常存放在一个文件中): 2) 在网络上传送对象的字节序列. 可是我有一个疑问:第一个作用在什么情况会用到呢?第二个作用在什么情况会用到呢? 答: 归纳起来,就是把你的数据换个时间和/或换个地方,继续使用 换个时间,比如存盘 换个地方,比如网络传输 当然,实现"换个时间/地方用"的方式很多很多 正解...真正自己去序列化的还是比较少的,很多框架里面都做好了的..类似序列化功能的实现方式很多,不一定

Java序列化的几种方式以及序列化的作用

Java序列化的几种方式以及序列化的作用 本文着重讲解一下Java序列化的相关内容. 如果对Java序列化感兴趣的同学可以研究一下. 一.Java序列化的作用    有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从一个字节流中恢复一个Java对象.例如,有的时候我们想要 把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流.对于这种通用 的操作,我们为什么不使用统一的格式呢?没错,这里就出现了java

C# Serializable对象序列化的作用

1.序列化定义:将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象. 在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创建出与原对象完全相同的副本 2.使用序列化的原因:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域

java中序列化的作用

一  什么叫序列化 通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输. 二 序列化有什么作用 1.方便传输,速度快,还很安全,被调用方序列化,调用方反序列化即可拿到传输前最原始的java对象,常用于不同进程之间的对象传输 2.方便存储,不管是存储成文件还是数据库,都行,存储为文件,下回要用可以直接反序列拿到对象 三 怎么序列化和反序列化 实现序列化接口就行(里面什么方法都没有,不用管的,只是一个标记接口而已)Serializable: 至于他们的

Serializable序列化的作用

这里转载一篇讲解java序列化(Serializable)和反序列化方面的感觉很好的文章.1.序列化是干什么的?简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化.2.什么情况下需要序列化a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你

ObjectStream 及 序列化 介绍

ObjectInputStream 和 ObjectOutputStream 介绍 ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持.创建“文件输出流”对应的ObjectOutputStream对象,该ObjectOutputStream对象能提供对“基本数据或对象”的持久存储:当我们需要读取这些存储的“基本数据或对象”时,可以创建“文件输入流”对应的ObjectInputStream,进而读取出这些“基本数据或对象”.注

Hadoop基础-07-MapReduce原理、序列化和源码分析

1. MapReduce原理 1.1.          MapReduce概述 (1)MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. (2)MapReduce由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算,非常简单.这两个函数的形参是key.value对,表示函数的输入信息. (3)在Hadoop 中,map 函数 位 于 内 置 类 org.apache.hadoop.map

serialVersionUID的作用以及IDEA、Eclipse如何自动生成serialVersionUID

说到serialVersionUID,首先要讲讲序列化. 序列化: 序列化可以将一个java对象以二进制流的方式在网络中传输并且可以被持久化到数据库.文件系统中,反序列化则是可以把之前持久化在数据库或文件系统中的二进制数据以流的方式读取出来重新构造成一个和之前相同内容的java对象. 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收方则需要把字节序列再恢复为Java

Java序列化的理解与学习

1.什么是Java序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比 JVM的生命周期更长.但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象.Java对象序列 化就能够帮助我们实现该功能. 必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量.由此可知,对象序列化不会关注类中的静态变量. 所谓序列化其实就是将程序中的数据(对