Python序列化和反序列化

什么是序列化,反序列化?
序列化:将对象转换为字节序列的过程称为对象序列化。
反序列化:将字节序列恢复为对象的过程称为对象的反序列化。
自我理解:
当代码运行时,我们可以看到很多对象,可以是一个或一个对象的集合,很多对象数据,这些数据,一些信息我们希望它保存很长时间,所以这需要做:
“数据写入”**序列化**-是将内存中的这些对象变成一系列字节描述的过程。
将项目中的数据写入到文件保存本地是很常见的。
同样,如果要读取保存的文件,在我们的项目中显示数据,或者自己使用数据。
然后你需要做:
“文件读取”**反序列化**-是将文件中的一系列字节转换为一个对象并存储在内存中的过程。
虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,还取决于两类的序列化。 ID 是否一致(例如Java常见的Java) private static final long serialVersionUID = 1L)。
清单 1 虽然两类的功能代码完全一致,但如果序列化 ID值 不同的是,它们不能相互序列化和反序列化。
简单来说,Java的序列化机制是通过运行时判断serialversionUID来验证版本的一致性的。
在什么情况下需要序列化?
当您想将内存中的对象状态保存到文件或数据库中时;
当你想用套接字在网络上传输对象时;
当你想通过RMI传输对象时;
(最常用的可能是存储数据库)
实现序列化
1.java中
在java中实现序列化和反序列化:Java Serializable 序列接口。
publicclassxxximplementsSerializable{
privatestaticfinallongserialVersionUID=1L
}2.python中
Python中,Pickle模块用于实现数据序列化和反序列化。
(1)只能在python中使用,只支持python的基本数据类型。
(2)可以处理复杂的序列化语法。(如自定义方法、游戏归档等。)
(3)序列化时,整个序列对象只是序列化,而不是内存地址。
需要引入:
importpickle
一、dump()方法
pickle.dump(obj,file,[,protocol])
并序列化写入文件:
importpickle
test=r'test.txt'
#同一函数的名称也应在反序列化代码中定义,函数体没有限制
defsayhi(name):
print("hello",name)
info={
'':'',
'age':32,
'func':sayhi
}
print(pickle.dumps(info))
withopen(test,'wb')asf:
#f.write(pickle.dumps(info))
pickle.dump(info,f)#跟上面的f.write(pickle.dumps(info))语意完全一样。注:序列化对象,将对象obj保存到文件file中。参数protocol是一种序列化模式,默认为0(ASCII协议,表示以文本的形式序列化)。protocol的值也可以是1和2(1和2,表示以二进制的形式序列化。其中,1是旧的二进制协议;2是新的二进制协议)。file表示,file必须有write()接口,file可以是“w打开的文件或StringIO对象,也可以是任何可以实现write()接口的对象。
二、load()方法
pickle.load(file)
从文件中读取并返回序列化:
importpickle
test=r'test.txt'
#在序列化代码中定义相同的函数名,函数体没有限制
defsayhi(name):
print("hello",name)
print("hello2",name)
withopen(test,'rb')asf:
#data=pickle.loads(f.read())
data=pickle.load(f)#跟着上面的data=pickle.loads(f.read()语义完全一样。
print('data>>>',data)
print(data['func']("Alex"))注:反序列化对象将文件中的数据分析为python对象。file包括read()接口和readline()接口
一般来说,在python中,两种方法是连用的。

python学习网,大量免费python视频教程,欢迎在线学习!
本文转自:https://blog.csdn.net/ITBigGod/article/details/86477083
