2019/10/24 05-msgpack使用

序列化和反序列化,务必搞懂,所有的序列化方案不过是一种格式,就认为是架子一样,架子上必须放你的物品,不可能把你的物品改了,不允许随便改,改了也会给你想办法改回来,除非有些数据特别占空间
不同的序列化方案就是不同架子,把你的数据摆上去即可,
反序列化是,架子不要,从架子把数据拿过来,加标签这些数据什么类型

xml和jsion都是序列化方案,不是二进制的序列化方案,而是文本的序列化方案,而xml是后来解决数据交互,程序跟程序之间交互的中间格式
程序交互,必须先做序列化,然后再做反序列化,二进制的方案只是一种选择,还可以选择文本,这个文本最常用的就是xml和json
xml太大太占空间,现在都是作为配置文件替代ini

在这里插入图片描述
json可以做为序列化和反序列化方案,围绕json的网络开发技术也是很多的,
json (JavaScript object notaiion ,js对象标记)
ECMAscript是标注(w3c指定的标准), javascript 只是实现

http://www.json.org
在这里插入图片描述
json,javascript能用几种数据类型,这里就能用几种,本来就是用来描述javascript的数据结构的
在这里插入图片描述
字符串是由双引号包围起来的任意字符的组合,可有转义字符,比如\n在这里插入图片描述在这里插入图片描述
key必须是字符串,就需要有双引号包围这个字符串在这里插入图片描述
一个对象改如何定义,、两头{}
必须经过大括号{},可以往上走,第一条代表空对象
第二条,string:value kv对
第三条:string:value 遇到,逗号,弯折回来,可以定义第二个key:定义vlaue,不出去 继续拐弯
在这里插入图片描述
数字等价于列表
第一条等价于空属组
第二条,中间带一个值出去了
第三条,带一个值,遇到逗号,带第二个值

在这里插入图片描述
说白了就是个字典dict,person的值有两个列表。里面有kv
在javascript叫对象
这个对象里面分为有两个键值对的,这个value是个数组,数组里面包含两个对象,这两个对象各有两个键值对
在这里插入图片描述在这里插入图片描述
python里支持少量的内建数据,python大写,json小写
字典dict对于对象object

在这里插入图片描述
dumps转成文本,虽然是文本,有时会或多或少有一些编码问题,因为是文本才有编码问题
在这里插入图片描述
字符串类型,pickle是转换成二进制的,但是json其实是文本的,所以尽量转换成文本了
dumps(不落地)就不存了,就拿到一个字符串了
拿到字符串就可以反序列化了,
在这里插入图片描述
看看反序列化变成什么
从字符序列装载起来变成python中的数据结构,就是字典,因为有对应关系
在这里插入图片描述
在这里插入图片描述
转换总共4个方法
dump跟文件操作相关(写到文件里去)
load 从文件里读
dumps dump出来一个字符串
loads从字符串还原出对象

在这里插入图片描述
json的这几个方法也跟pickle兼容,序列化和反序列化只需要记住这4个方法即可
dump是序列化过程,。load是从序列化的数据直接装载,变成python中的对象
dumps往往变成序列,并不弄成文件 loards 后面的s代表序列,操作文件

一般直接在内存中得到序列,把序列传走,用pikele就是二进制的,如果是字符序列也传走

一般json的编码很少落地,数据都是通过网络传输,传输的时候,要考虑压缩它(把无用的空白字符压缩掉)有些优化就是要到字节级别,斤斤计较

本质上来说,json是个文本
在这里插入图片描述
数字20单字节就可以描述了,字符串的20,转成ascii码,就是两个字节,这里全是字符串
在这里插入图片描述
json的序列化是文本序列化,既然是文本就跟编码方式有点关系了,结构也简单

json是文本文件,ini看起来是个port=5000实际不是,是字符串5000不是数字5000,已经存在在文本里面
json常用的方法就两个,一般不落地,dumps和loards用的多

dumps返回一个字节序列,查看这个字节序列有多长
上面dumps序列化成2进制
下面是json格式

在这里插入图片描述
把空格替换掉(现实情况可能还要考虑value的空格),能压缩的话,是72字节,上面用了101个字节在这里插入图片描述
pickle序列化,要么传网络要么传文件,结果发现消耗的字节数可能更多点,所以json也有好处在这里插入图片描述在这里插入图片描述
这个msgpack也是bytes,才48
在这里插入图片描述
其实还可以做数据压缩,如果存储了100个1,他就给你100,1,所谓的压缩算法都这么做在这里插入图片描述
广告毫不客气
在这里插入图片描述https://msgpack.org在这里插入图片描述在这里插入图片描述
name和age一直在重复,可以把name缩写成n,在内部有个压缩的算法

redis都用
在这里插入图片描述在这里插入图片描述在这里插入图片描述
有几个方法,
packb是打包
unpackb是解包相当于loards

在这里插入图片描述
pack相当于dump,从内存中导出去
unpack 相当于load

在这里插入图片描述在这里插入图片描述
messagepack简单易用,高校压缩,支持语言丰富

序列号中经常会出现一种问题,一般都是通过网络来交换信息的,一个java写,一个python写,用pickle就不合适,用json传输就效率太低,没有二进制高,
这时候用MessagePack,是比较高效的,简单易用

合理的选择序列化和反序列化方案是在项目中要考虑的,一般不要选择pickle,用json,内建的库,支持json也就4个方法,
如果觉得json差,就可以用2进制的,MessagePack,简单易用就好维护
理解一下,字节,数字,字符串,序列,文本之间是什么关系

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v1/object.hpp:664:34: error: ‘void* memcpy(void*, const void*, size_t)’ copying an object of non-trivial type ‘struct msgpack::v2::object’ from an array of ‘const msgpack_object’ {aka ‘const struct msgpack_object’} [-Werror=class-memaccess] std::memcpy(&o, &v, sizeof(v)); ^ In file included from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/object_fwd.hpp:17, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v1/adaptor/adaptor_base_decl.hpp:14, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/adaptor/adaptor_base_decl.hpp:13, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/adaptor/adaptor_base.hpp:13, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v1/object_decl.hpp:16, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/object_decl.hpp:14, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/object.hpp:13, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack.hpp:10, from /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/example/cpp03/stream.cpp:10: /home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master/include/msgpack/v2/object_fwd.hpp:23:8: note: ‘struct msgpack::v2::object’ declared here struct object : v1::object { ^~~~~~ cc1plus: all warnings being treated as errors make[2]: *** [example/cpp03/CMakeFiles/stream.dir/build.make:63:example/cpp03/CMakeFiles/stream.dir/stream.cpp.o] 错误 1 make[2]: 离开目录“/home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master” make[1]: *** [CMakeFiles/Makefile2:415:example/cpp03/CMakeFiles/stream.dir/all] 错误 2 make[1]: 离开目录“/home/AQTJClient/AQTJAuditClient/depends/msgpack-c-master”
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值