知行编程网知行编程网  2023-01-12 01:00 知行编程网 隐藏边栏  3 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python序列化和反序列化的相关知识,包括python序列化,以及python输出所有组合这些编程知识,希望对大家有参考作用。


Python序列化和反序列化


什么是序列化,反序列化?

序列化:将对象转换为字节序列的过程称为对象的序列化。

反序列化:将字节序列恢复为对象的过程称为对象的反序列化。

自我理解:

代码运行时,我们看到了很多对象,可以是某个类的一个对象,也可以是对象的集合,还有很多对象数据。在这些数据中,我们想要持久保存一些信息,所以需要这样做:

数据写入 》》》**序列化**——就是把内存里面的这些对象给变成一连串的字节描述的过程。

常见的做法是将项目中的数据写入一个文件,保存在本地。

同样,如果你想读取保存的文件,它会在我们的项目中显示为数据,或者你自己使用。

那么就需要做:

文件读取》》》**反序列化**——就是把文件中一连串的字节转为一个对象放入内存里存放的过程。

虚拟机是否允许反序列化不仅取决于类路径和函数代码是否一致,还取决于两个类的序列化ID是否一致(比如java中常见的private static final long serialVersionUID = 1L)。

在清单1中,虽然两个类的功能代码完全相同,但是如果序列化ID值不同,则无法相互序列化和反序列化。

简单的说,Java的序列化机制通过在运行时判断一个类的serialVersionUID来验证版本一致性。


什么情况下需要序列化?

当你想将内存中的对象状态保存到文件或数据库中时;

当你想用套接字在网络上传送对象的时候;

当你想通过RMI传输对象的时候;

(最常用的可能就存数据库的)


实现序列化

1.java中

在java中序列化和反序列化实现:Java Serializable 序列化接口。

public class xxx implements Serializable {
 private static final long serialVersionUID = 1L
}

2.python

在Python中,Pickle模块就用来实现数据序列化和反序列化。

(1)只能在python中使用,只支持python的基本数据类型。

(2) 可以处理复杂的序列化语法。 (如自定义类方法、游戏存档等)

(3)序列化时,只序列化整个序列对象,不序列化内存地址。

需要引入:

import pickle


一、dump()方法

pickle.dump(obj, file, [,protocol])

写入文件并序列化:

import pickle
test = r'test.txt'
#反序列化代码中也要定义相同的函数名称,函数体没限制
def sayhi(name):
    print("hello",name)
info = {
    '':'',
    'age':32,
    'func':sayhi
}
print(pickle.dumps(info))
with open(test,'wb') as f:
    #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)

从文件中读取,并返序列化:

import pickle
test = r'test.txt'
#需要定义序列化代码中同样的函数名,函数体没限制
def sayhi(name):
    print("hello",name)
    print("hello2",name)
with open(test,'rb') as f:
    # data = pickle.loads(f.read())
    data = pickle.load(f)  #跟上面的data = pickle.loads(f.read())语意完全一样。
    print('data>>>',data)
print(data['func']("Alex"))

注意:反序列化对象,将文件中的数据解析成python对象。文件中有read()接口和readline()接口

一般来说在python中,两个方法是连用的。

Python序列化和反序列化

python学习网,大量的免费
,欢迎在线学习!

本文转自:https://blog.csdn.net/ITBigGod/article/details/86477083

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享