概念

vmware虚拟机,在挂起的时候不是以数据库来存储当前数据的,而是将数据存储到文件中,不过能存储到文件中的只有字符串和二进制,这个文件存储到硬盘中。

那么vmware在恢复挂起的时候,又需要从文件中读取数据,可是之前我们存储的时候无论什么数据只要存储到文件中就是字符串,但我们恢复读取时也是字符串,那么如何将其恢复为原有的数据。

比如字典类型的字符串数据从文件中读取到python中后还是字典。

info ={
'name':'zhangsan',
'age':22
}

f = open('test.txt','w')
f.write(str(info))            #通过str将写入的数据改为字符串格式
f.close()

Python20 jason and pickle序列化_第1张图片

这里是通过eval实现,将字符串读取后转为相应的数据格式。

image_1c0aqanef1b7ghv51cfp1q9iln0m.png-0.4kB

json

import json

info ={
'name':'zhangsan',
'age':22
}

x = json.dumps(info)    #序列化:将数据序列化(变为str数据类型)
print (type(x))

image_1c0aqbdfp1e5o1es02hv1l57ko013.png-1.2kB
可以看到当前数据类型是字符串

f = open('test.txt','w')
f.write(json.dumps(info))     #将数据从内存中存储到硬盘的文件中。
f.close()

import json

f = open('test.txt','r')
data = json.loads(f.read())    #反序列化:只有通过json写入的数据,才能通过json读取,读取到内存中
print (data,type(data))

image_1c0aqc45q8j813he1ut8vtqicl1g.png-2.9kB

print (data['age'])

image_1c0aqcl95sndoq81fnr4sobuq1t.png-0.4kB

Python20 jason and pickle序列化_第2张图片

.image_1c0aqd24k14u7ig71od911r88pj2n.png-4.4kB
报错,新增的函数内存地址是一个不可序列化的类型,所以说 json 只能处理简单的数据类型,比如字典、列表、字符串这样的。
json除了python,json还在其他几乎所有语言中也支持,所以json主要用于不同语言之间的数据交互(不同语言之间的数据转换)。
较复杂的数据在不同语言之间完全不一样,所以json只能处理简单的数据。

pickle

pickle和json的用法完全一样,只是名字换了而已。
Python20 jason and pickle序列化_第3张图片

image_1c0aqepvnnsfsgnqhc1hia1kre3h.png-12.8kB

Python20 jason and pickle序列化_第4张图片

Python20 jason and pickle序列化_第5张图片
看着像是乱码,其实是二进制,只不过是pickle语法处理的规则导致这样,这里千万不要理解为乱码就是加密。

Python20 jason and pickle序列化_第6张图片

image_1c0aqg58ceeeicb1sgec5dune58.png-16kB
读取权限为rb,读取时也使用pickle,不过这里却报错了,这是因为在写入和读取时是在两个.py文件中运行的,写入时sayhi这个函数存在'序列化.py'文档中,当'序列化.py'这个程序运行完成时,sayhi这个内存地址就会从内存中剔除,所以当'反序列化.py'这个文档运行读取时在内存中找不到这个内存地址,所以会报错。

Python20 jason and pickle序列化_第7张图片
在'反序列化.py'这个文档中将sayhi这个函数加进去,此时内存中就有了sayhi这个函数的内存地址,这时再去运行就不会报错了。
image_1c0aqhd41sqbdqd1s6d1mtp121b6v.png-5.7kB

json可以被多语言支持

pickle只能在python之间支持

  • dump、load
    Python20 jason and pickle序列化_第8张图片
    除了dumps外还有dump,使用dump的话写法不一样,可以看到语法提示中obj是对象,file是文件
    Python20 jason and pickle序列化_第9张图片

Python20 jason and pickle序列化_第10张图片
使用load

  • 多次dumps
    Python20 jason and pickle序列化_第11张图片

image_1c0aqkf6h1iq4pl7h0s2261h6h90.png-3.8kB
可以看到多次dumps是可以实现的

Python20 jason and pickle序列化_第12张图片

Python20 jason and pickle序列化_第13张图片
在python3中却不能多次loads,会报错,在python2中可以; 不过多次dumps和多次loads没有任何意义,比如在vmware中,可以有多个快照,每一个快照数据都存在一个单独的文件中,而不是多个快照都存在同一个文件中,所以dumps只需要进行一次,然后loads一次就可以了。