序列化、持久化
通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长。并且需要时可以再次将这个对象读取出来。Python中有几个常用模块可实现这一功能。
json模块:
序列化:
import json
info = {
'name':'alex',
'age':22
}
f = open("test.txt","w")
print(json.dumps(info))
json.dump(info,f) #等于 f.write( json.dumps( info) )
f.close()
反序列化:
import json
def sayhi(name):
print("hello2,",name)
f = open("test.txt","r")
data = json.load(f) #等于 data = json.loads(f.read())
print(data)
注意:
dumps 和loads一起使用
dump和load一起使用
虽然混合也能使用,为了规范吧。
json是可以把跨语言使用,可以在Java,Python,c++等,接受他们语言的数据然后序列化。json只能处理简单的数据;
json模块主要用于处理json格式的数据,可以将json格式的数据转化为python的字典,便于python处理,同时也可以将python的字典或列表等对象转化为json格式的数据,便于跨平台或跨语言进行数据交互
pickle模块:
序列化:
import pickle
def sayhi(name):
print("hello,",name)
info = {
'name':'alex',
'age':22,
'func': sayhi #json处理不了函数的地址
}
f = open("test.txt","wb")
print(pickle.dumps(info))
pickle.dump(info,f) #等于 f.write( pickle.dumps( info) )
f.close()
反序列化:
import pickle
def sayhi(name):
print("hello2,",name)
f = open("test.txt","rb")
data = pickle.load(f) #等于 data = pickle.loads(f.read())
data["func"]("Alex")
注意:
说明:序列化和反序列化是在两个Python文件中写的;
在序列化中sayhi函数的地址,在运行完后sayhi就释放了;
我们反序列化,需要sayhi的地址,所以在反序列化的文件代码里写了一个sayhi的函数,反序列化,找的是反序列化代码文件中的内存地址,而不是序列化中sayhi的内存地址.
pickle.dumps 和json.dumps功能一样,但是以字节(bytes)对象形式返回封装的对象;json是以str处理数据的;
pickle.loads和json.loads功能一样,但是从字节(bytes)对象中读取被封装的对象,并返回;json是以str处理数据的;
pickle 是 python专有,更适合处理复杂类型的序列化;
--------------------------------------------------------------------
shelve模块:
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式。
shelve存储例子:
import shelve
import datetime
d = shelve.open('shelve_test') # 打开一个文件
info = {'age':22,"job":'it'}
name = ["alex", "rain", "test"]
d["name"] = name # 持久化列表
d["info"] = info # 持久化dict
d['date'] = datetime.datetime.now() #持久化时间
d.close()
shelve获取存储的内容:
import shelve
import datetime
d = shelve.open('shelve_test') # 打开一个文件
print(d.get("name"))
print(d.get("info"))
print(d.get("date"))
序列化:把对象转换为字节序列的过程称为对象的序列化
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
对象只有在序列化之后才能进行持久化存储,从持久化存储介质加载的数据通过反序列化转变成运行时对象。
持久化就是把内存中的对象保存到外存中,让以后能够取回。而保存和取回的过程就是经过序列化和对象io完成的。
比如一个变量,储存到硬盘,硬盘是二进制格式,变量->二进制转换(序列化)->写入硬盘(持久化).
参考:https://www.cnblogs.com/pycode/p/5575342.html