Python 序列化/反序列化自定义类型
时间:2022-07-25
本文章向大家介绍Python 序列化/反序列化自定义类型,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
内置json模块对于Python内置类型序列化的描述
"""Extensible JSON <http://json.org> encoder for Python data structures.
Supports the following objects and types by default:
+-------------------+---------------+
| Python | JSON |
+===================+===============+
| dict | object |
+-------------------+---------------+
| list, tuple | array |
+-------------------+---------------+
| str | string |
+-------------------+---------------+
| int, float | number |
+-------------------+---------------+
| True | true |
+-------------------+---------------+
| False | false |
+-------------------+---------------+
| None | null |
+-------------------+---------------+
To extend this to recognize other objects, subclass and implement a
``.default()`` method with another method that returns a serializable
object for ``o`` if possible, otherwise it should call the superclass
implementation (to raise ``TypeError``).
"""
内置json模块对于Python内置类型反序列化的描述
"""Simple JSON <http://json.org> decoder
Performs the following translations in decoding by default:
+---------------+-------------------+
| JSON | Python |
+===============+===================+
| object | dict |
+---------------+-------------------+
| array | list |
+---------------+-------------------+
| string | str |
+---------------+-------------------+
| number (int) | int |
+---------------+-------------------+
| number (real) | float |
+---------------+-------------------+
| true | True |
+---------------+-------------------+
| false | False |
+---------------+-------------------+
| null | None |
+---------------+-------------------+
It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as
their corresponding ``float`` values, which is outside the JSON spec.
"""
分别使用pickle和json模块来实现自定义类型的序列化和反序列化
class Person():
"""人类"""
# __slots__ = ['age']
# __dict__ = ['age', 'name']
_age: int = 0
def __init__(self, age, name='eason'):
# json.JSONEncoder.__init__(self, skipkeys=True)
self.age = age
self.name = name
# self.name = name
# def __dir__(self):
# return ['age', 'name']
@property
def age(self) -> int:
return self._age
@age.setter
def age(self, age: int):
print('set age')
if age <= 0:
raise ValueError('age')
self._age = age
def hello(self):
print('==============hello-locals===============')
print(locals())
import pickle
import json
from demo.src.models.person import Person
# import demo.src.models.person.Person
class PersonJSONEncoder(json.JSONEncoder):
def default(self, o: Person):
# 返回字典类型
return {"name": o.name, "age": o.age}
# def encode(self, o: Person):
# # 直接返回字典,
# return str({"age": o.age, "name": o.name})
class PersonJSONDecoder(json.JSONDecoder):
def decode(self, s: str):
obj_dict = json.loads(s)
# return Person(obj_dict['age'], obj_dict['age'])
return Person(**obj_dict)
p = Person(28, 'wjchi')
# bytes
# p_bytes = pickle.dumps(p)
# print(type(p_bytes), p_bytes)
# p_obj = pickle.loads(p_bytes)
# print(type(p_obj), p_obj.age)
# string
# p_str = json.dumps(p, default=lambda obj: obj.__dict__)
# print(type(p_str), p_str)
# p_dict = json.loads(p_str)
# print(type(p_dict), p_dict['age'])
p_str = json.dumps(p, cls=PersonJSONEncoder)
print(type(p_str), p_str)
p_dict = json.loads(p_str)
# print(type(p_dict), p_dict['age'])
# p_obj = json.loads(p_str, cls=PersonJSONDecoder)
p_obj = Person(**p_dict)
print(type(p_obj), p_obj.age)
- 2 分钟论文:语音生成表情包背后的技术原理
- 享学课堂谈-Python程序员的常见错误
- 区块链技术,如何提升网络安全?
- 趣店推“大白汽车”业务 启用域名dabaiqiche.com
- 糖果吃了那么多,你真的知道比特币分叉是咋回事吗?
- 静息态网络拓扑传输认知任务信息
- MYSQL字符串截取总结:LEFT、RIGHT、SUBSTRING、SUBSTRING
- 如何用Python提取中文关键词?
- 工信部:将加大网络提速降费力度加快百兆宽带普及
- 人工智能AI(5):线性代数之矩阵、线性空间
- iOS开发进阶篇——FRP与ReactiveCocoa的介绍(一)
- 英伟达修改GeForce软件使用条款:禁止在数据中心运行深度学习等应用
- 浅谈几种SLB技术的实现
- 史上最逼真人形机器人堪比健身教练,技能满满还会流汗
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP递归统计系统中代码行数
- PHP切割整数工具类似微信红包金额分配的思路详解
- php写入文件不覆盖的实例讲解
- php解决crontab定时任务不能写入文件问题的方法分析
- Laravel项目中timeAgo字段语言转换的改善方法示例
- php生成微信红包数组的方法
- 解决php写入数据库乱码的问题
- php写入txt乱码的解决方法
- PHP实现的AES 128位加密算法示例
- php写入mysql中文乱码的实例解决方法
- php实现的支付宝网页支付功能示例【基于TP5框架】
- php校验公钥是否可用的实例方法
- PHP实现的微信APP支付功能示例【基于TP5框架】
- php创建多级目录与级联删除文件的方法示例
- Linux VPS定时备份服务器/网站数据到Github私人仓库