我现在的工作中,有一件事情一直烦着我,那就是公司的序列化协议文件的编写,我感觉这是一件非常简单的事情,但是为什么光是一个*.h文件就要27916行代码,而*.cpp文件就需要66921行代码。

我来简单地写一下公司的协议定义:

.h头文件
struct Person:
{Person();~Person(){ReleaseMemory();};AnalyzeMsgHead(char* thebuf);int FillBuf(char*& thebuf);void AnalyzeBuf(char* thebuf, int msgsize);void ReleaseMemory(){};Public:  string name;string age;string address;string phoneNumber; private:int GetMyMemSize();
};

.cpp文件Person::Person(){name = "";age= "";address= "";phoneNumber= "";}void Person:AnalyzeBuf(char* thebuf, int msgsize)
{int theBufContent = 0;//name    name    =  thebuf+theBufContent;theBufContent += name.length()+1; //ageage = thebuf+theBufContent;theBufContent += age.length()+1;     //addressaddress = thebuf+theBufContent;theBufContent += address.length()+1; //phoneNumberphoneNumber = thebuf+theBufContent;theBufContent += phoneNumber .length()+1;
}int Person::FillBuf(char*& thebuf)
{thebuf = new char[GetMyMemSize()];    //namememcpy(thebuf+theBufContent, name.c_str(), name.length()+1);theBufContent += name.length()+1;//agememcpy(thebuf+theBufContent, age.c_str(), age.length()+1);theBufContent += age.length()+1;//addressmemcpy(thebuf+theBufContent, address.c_str(), address.length()+1);theBufContent += address.length()+1;//phoneNumbermemcpy(thebuf+theBufContent, phoneNumber.c_str(), phoneNumber.length()+1);theBufContent += phoneNumber.length()+1;return theBufContent;
}int Person::GetMyMemSize()
{    memSize += name.length()+1;            //namememSize += age.length()+1;                //agememSize += address.length()+1;            //addressmemSize += phoneNumber.length()+1;        //phoneNumberreturn memSize;
}

  好吧,以上是完全的C语言风格的定义,随随便便定义一个协议就几十行的代码。如果定义vector、map这些类型的,那就更复杂了,如果加上嵌套的话,比如:

vector<vector<vector<int>>> 基本上是要人命。

我一直想着各种法子修改这段协议代码,力求简单、易读,可以维护,我尝试了很多其他人的方法,我一一列举吧。

一、MFC的CArchive类

来看这篇文章http://blog.csdn.net/yestda/article/details/17177097 ,一篇关于CArchive的使用方法。

但是我觉得如果真用CArchive来写的话,未来肯定又是一个坑。我只是比较喜欢CArchive的读写方式,非常简单,如下:

二、使用google的protobuf

一篇关于protobuf写得比较好的文章:

http://blog.csdn.net/majianfei1023/article/details/45112415/

通过这篇文章可知,要使用protobuf,那也不是一件非常简单的事情,要做一些我个人觉得不喜欢的事情:

(1)下载protobuf源码

(2)编译源代码

(3)定义一个proto,如 person.proto

(4)生成目标语言(c++)格式。(生成了person.pb.h和person.pb.cc的文件)

其实说白了protobuf这东东就只是定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。 这就说明了我必须要有.proto文件,否则读不出任何数据。

相对我的项目而言,还是很麻烦。

那我为什么不用json或xml,就我个人而已,json和xml虽然简单、易读,但是有一点我不喜欢,就是数据体积很大,还不如我自己公司编写的。大家可以看《protobuf开发指南》的1.3节,protobuffer的体积普遍比xml小3-10倍。

我唯一喜欢的,是protobuf的序列化和解序列化方式,示例代码:

Person person;
person.set_name(XXXX);
person.set_age(23);
string sOrder;
person.SerailzeToString(&sOrder); //这就将数据序列化到 sOrder里面了。
--------------------------------------------------------------------Person person2;
if(person2.ParseFromString(sOrder))  //从字符串sOrder中提取数据
{cout << "name:" << person2.name() << endl<< "age:" << person2.age() << endl;
}
else
{cerr << "parse error!" << endl;
}
---------------------------------------------------------------------

相对我公司的代码,是非常非常的简洁的。

参考了carchive和protobuf,但它们相对于我公司的项目,都没有什么实用性。

即使我改为其中的任何一种,我的那些同事都不会接受的,因为他们很懒,习惯了一个东西就很难改变。

我觉得需要写出另一种更为简单、便捷的协议定义方式,起码能让我的同事接受。

看了别人的“轮子”,那么我说一下我心中理想的的使用方式:

#include <iostream>
#include "Serialize.h"using namespace std;
struct MyStruct
{
public:void toString(string &str){CSeriralize serial;serial << a << b << _char << str1 << vec_ini << vec_vec_int;str = serial.buffer();}void unString(const string &str){CSeriralize serial(str);serial >> a >> b >> _char >> str1 >> vec_ini >> vec_vec_int;}
public:int a;int b;char  _char;string str1 ;vector<int> vec_ini;vector<vector<int>> vec_vec_int;
};int _tmain(int argc, _TCHAR* argv[])
{MyStruct test;test.a = 1;test.b = 2;test._char = 'c';test.str1 = "fafafasf";test.vec_ini.push_back(1);test.vec_ini.push_back(2);test.vec_vec_int.push_back(test.vec_ini);test.vec_vec_int.push_back(test.vec_ini);string str;test.toString(str);//--------------------------------------------------------------------------------------------
    MyStruct test1;test1.unString(str);getchar();return 0;
}

就是说我需实现一个类: CSeriralize ,这样的话,我公司的代码至少减少百分之七十以上,因为.cpp文件可以完全去掉,也可以不重写那个几个函数。

关于这个类的实现:https://github.com/wanglinhai888/TestSerials

现在只是初步实现了这个类,提供一种思路,而内存保护啊什么的都没有弄,未来还会加入支持map、set、list 等方式,支持大小端,支持跨平台等等等。

转载于:https://www.cnblogs.com/wanglinhai/p/6223156.html

关于数据传输格式的序列化和反序列化相关推荐

  1. 一文读懂Json序列化与反序列化

    一文读懂Json序列化与反序列化 一文读懂Json序列化与反序列化 #mermaid-svg-tVjnnlFu6ZBDpGOQ {font-family:"trebuchet ms" ...

  2. 数据传输:json格式序列化与反序列化(将类转化为json格式与将json格式转化为类)

    数据传输:json格式序列化与反序列化(将类转化为json格式与将json格式转化为类) 在最近的实验中,使用了json来传送客户端与服务端的信息,之前原本想使用自己定义的格式,但是使用json可以将 ...

  3. .Net Core Json序列化和反序列化以及自定义JsonConverterT来转化特殊日期时间格式

    System.Text.Json 命名空间提供用于序列化和反序列化 JavaScript 对象表示法 (JSON) 的功能. System.Text.Json 命名空间包含所有入口点和主要类型. Sy ...

  4. C#实现对象的Xml格式序列化及反序列化

    要序列化的对象的类: [Serializable] public class Person { private string name; public string Name { get { retu ...

  5. 十三、序列化和反序列化(部分转载)

    json和pickle序列化和反序列化 json是用来实现不同程序之间的文件交互,由于不同程序之间需要进行文件信息交互,由于用python写的代码可能要与其他语言写的代码进行数据传输,json支持所有 ...

  6. json 反序列化 父子类型_Json的序列化和反序列化

    一.什么是Json: 中午肚子饿了,到餐厅点餐.向服务员点了几个菜,厨师根据用户的需求,开始烹饪食物,食物烹饪好后,怎么将食物呈现给用户呢?这时就需要用到盛放食物的碗了.用户拿到盛放食物的碗,就可以获 ...

  7. C#中json序列化与反序列化

    json格式概念 JSON(JavaScript Object Notation) 是一种轻量级的数据传输格式,其采用完全独立于语言的文本格式,使JSON成为理想的数据交换语言. json由两种格式组 ...

  8. 开发者应当熟知的 C# 序列化和反序列化

    作者 | 喵叔 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 今天我利用这篇文章给大家讲解一下 C# 中的序列化与反序列化.这两个概念我们在开发中经常用到,但是我们绝大部分只用到了其中 ...

  9. 序列每天从0开始_序列化、反序列化原理和Protobuf实现机制

    1.基本概念 1.1 什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: (2)序列化:对象序列化的最主要的 ...

最新文章

  1. 【每周CV论文】初学深度学习图像对比度增强应该要读的文章
  2. 函数式编程filter函数,list()表示列表显示值
  3. VB.NET版机房收费系统—DataGridView应用
  4. 数据类型及其基本操作
  5. Rust学习笔记——模式和匹配
  6. ES6——函数的name属性
  7. 反射 字段_巧用 Protobuf 反射来优化代码,拒做 PB Boy
  8. C#与Matlab混合编程中遇到的“MathWorks.MATLAB.NET.Arrays.MWNumericArray”的类型初始值设定项引发异常。
  9. 如何找回丢失的Applications文件夹
  10. python购物车代码_(Python基础)简单购物车代码
  11. c语言录屏软件wps,WPS制作录屏视频
  12. 兼容性视图html页面,浏览器兼容性视图设置在哪
  13. 【人物志】美团技术委员会前端通道主席洪磊:爱折腾的斜杠青年
  14. 解决:在 VSCode 中如何设置默认的浏览器为Chrome或Firefox
  15. esp8266调用心知天气
  16. 如何在FPS游戏中快速实现简单的人体定位算法
  17. Houdini 中DOP CHOP SHOP SOP VOP是什么?
  18. 常用计算机英语语句,常用的英语语句附中文
  19. git生成公钥的步骤
  20. 保研笔记三 数据结构(未完待续)

热门文章

  1. 乐播投延迟很高_定投基金有变化
  2. mysql dba环境验收_面对一个全新的环境,作为一个Mysql DBA,应该了解
  3. 前端如何查看音频的长度_Android音频可视化
  4. 语法分析程序的设计与实现_编译工程7:语法分析(5)
  5. brew 无法安装iterm2_Mac安装sshpass 替代spawn自动登录脚本(解决rz sz问题)
  6. pid和linux的关系,linux – bash pid和$$之间的区别
  7. mysql二进制日志文件结构_MySQL 二进制日志的结构
  8. 通过反射创建新类示例的两种方式及比较
  9. 安卓案例:标准化测试
  10. 【codevs2460】【BZOJ1036】树的统计count,第一次的树链剖分