Python 对象的序列化和反序列化是任何非平凡程序的关键方面。如果您将某些内容保存到 Python 文件中,如果您读取配置文件,或者如果您响应 HTTP 请求,您都会进行对象序列化和反序列化。
从某种意义上说,序列化和反序列化是世界上最无聊的事情。谁会在乎所有这些格式和协议?您想持久化或流式传输一些 Python 对象,并在以后完整地取回它们。
这是一种在概念层面上看待世界的好方法。但是,在实际层面上,您选择的序列化方案、格式或协议可能会决定程序运行的速度、安全性、维护状态的自由度以及与其他系统互操作的程度。
有如此多的选择,因为不同的情况需要不同的解决方案。“一刀切”的方法行不通。在本分两部分的教程中,我将:
在以下部分中,我们将使用不同的序列化器对相同的 Python 对象图进行序列化和反序列化。为避免重复,让我们在此处定义这些对象图。
简单的对象图是一个字典,其中包含整数列表、字符串、浮点数、布尔值和日期时间对象以及用户定义的类实例,该实例具有 dump、load 和 dump() 方法,可序列化到打开的文件(类似文件的对象)。
load() 方法从打开的类似文件的对象中反序列化。
TypeError:如下所示:```
Traceback (most recent call last):
File "serialize.py", line 49, in
print(json.dumps(complex)
File "/usr/lib/python3.8/json/init.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python3.8/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.8/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python3.8/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.class.name} '
TypeError: Object of type A is not JSON serializable
<code> 哇!这看起来一点也不好。发生了什么?错误消息是 JSONEncoder 类使用的 default() 方法在 JSON 编码器遇到无法序列化的对象时调用的。 自定义编码器的任务是将其转换为 JSON 编码器能够编码的 Python 对象图。在本例中,我们有两个需要特殊编码的对象:A 类。以下编码器可以完成这项工作。每个特殊对象都转换为“\_\_A\_\_”和 pprint 函数的 load() 和 object_hook 参数,允许您提供自定义函数来将字典转换为对象。 </code>
> def decode_object(o):
> if'a '
datetime 'in o:
>返回dateTime.strptime(o ['dateTime '],'%y-%m-%dt%h:%m:%m:%s')
> deserialized = json.loads(序列化,object_hook = decode_object)
print(deserialized)
###prints:{'a'a': 0)}
deserialized == complex ##评估对false
&lt>&lt;/
mainmain
.a&gt;
<code> 让我们使用 object_hook 参数进行解码。 </code>
以上是python对象的序列化和避难所化:第1部分的详细内容。更多信息请关注PHP中文网其他相关文章!