"""  """
__author__on__ = 'shaozhiqi 2019/9/24' # !/usr/bin/env python3
# -*- coding: utf-8 -*- # 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:
d = dict(name='Bob', age=20, score=88)
# 我们把变量从内存中变成可存储或传输的过程称之为**序列化**,在Python中叫pickling
# 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
# 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
# Python提供了pickle模块来实现序列化。
import pickle d = dict(name='Bob', age=20, score=88)
pickle.dumps(d)
# pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。
# 或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:
f = open('dump.txt', 'wb')
pickle.dump(d, f)
f.close()
# 看看写入的dump.txt文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。如下:
# �}q (X nameqX BobqX ageqKX scoreqKXu. # -----------------------------------pickle反序列化------------------------------------
# 当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,
# 然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。
# 我们打开另一个Python命令行来反序列化刚才保存的对象:
f = open('dump.txt', 'rb')
d = pickle.load(f)
f.close()
print(d) # {'name': 'Bob', 'age': 20, 'score': 88}
# 当然,这个变量和原来的变量是完全不相干的对象,它们只是内容相同而已。
#
# Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,
# 因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。 # ------------------------------------------json----------------------------------
# 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,
# 比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,
# 可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。
# JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。 # JSON类型 Python类型
# {} dict
# [] list
# "string" str
# 1234.56 int或float
# true/false True/False
# null None # -----------------Python对象->JSON--------------------------------------------
import json d = dict(name='Bob', age=20, score=88)
json_d = json.dumps(d)
print(json_d) # {"name": "Bob", "age": 20, "score": 88}
# dumps()方法返回一个str,内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个file-like Object。 # 要把JSON反序列化为Python对象,用loads()或者对应的load()方法,前者把JSON的字符串反序列化,
# 后者从file-like Object中读取字符串并反序列化:
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
dictvlaue = json.loads(json_str)
print(dictvlaue)
print(type(dictvlaue)) # <class 'dict'>
# 可以看到转化为了dict类型 # ----------------------------------------------------------------------------------
# Python的dict对象可以直接序列化为JSON的{},
# 不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化: import json class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score s = Student('Bob', 20, 88) # print(json.dumps(s))
# TypeError: Object of type Student is not JSON serializable # 错误的原因是Student对象不是一个可序列化为JSON的对象。
# 可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可: def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
} # 这样,Student实例首先被student2dict()
# 函数转换成dict,然后再被顺利序列化为JSON:
print(json.dumps(s, default=student2dict)) # {"name": "Bob", "age": 20, "score": 88} # 那么问题来了,难道我们每转化一个类为json都需要为其写一个转化函数吗?
# 因为通常class的实例都有一个__dict__属性,它就是一个dict,用来存储实例变量。
# 也有少数例外,比如定义了__slots__的class。
print('student:', json.dumps(s, default=lambda obj: obj.__dict__)) # student: {"name": "Bob", "age": 20, "score": 88} # 同样的道理,如果我们要把JSON反序列化为一个Student对象实例,
# loads()方法首先转换出一个dict对象,然后,我们传入的object_hook函数负责把dict转换为Student实例:
def dict2student(d):
return Student(d['name'], d['age'], d['score']) json_str = '{"age": 20, "score": 88, "name": "Bob"}'
student2 = json.loads(json_str, object_hook=dict2student)
print('json-student:', student2.name) # json-student: Bob

python3(三十八) serialize的更多相关文章

  1. NeHe OpenGL教程 第三十八课:资源文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. Java进阶(三十八)快速排序

    Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...

  3. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  4. 微信小程序把玩(三十八)获取设备信息 API

    原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...

  5. 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

    1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...

  6. bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  7. Deep learning:三十八(Stacked CNN简单介绍)

    http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...

  8. 【FastDev4Android框架开发】打造QQ6.X最新版本号側滑界面效果(三十八)

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50253925 本文出自:[江清清的博客] (一).前言: [好消息] ...

  9. Python学习(三十八)—— Djago之Ajax

    转载自:http://www.cnblogs.com/yuanchenqi/articles/7638956.html 一.Ajax准备知识:json 什么是json? 定义: JSON(JavaSc ...

随机推荐

  1. nested exception is java.lang.StackOverflowError解析

    背景介绍: 项目是微服务的,使用docker容器,使用jenkins部署.测试环境有个公共服务一直以来都能正常发布,突然有一天不行了,经常发布失败,然后多发布几次就好了. 报错如下: 是栈溢出了,一般 ...

  2. linux 配置网卡、远程拷贝文件、建立软硬链接、打包/解包、压缩/解压缩、包操作、yum配置使用、root密码忘记

    目录 一.配置网卡 二.xshell连接 三.远程拷贝文件 四.建立软硬连接 五.打包/解包和压缩/解压缩 六.包操作 七.配置yum源 配置yum源 配置阿里云源 常用命令 yum其他命令 八.重置 ...

  3. Spring框架——IOC 容器的创建与使用

    企业级开发框架 Spring Framework 是整个 Spring 生态的基础,各个模块都是基于 Spring Framework 衍生出来的. Spring 的两大核心机制 IOC 控制翻转.A ...

  4. System.Text.Json 序列化对所有 JSON 属性名称使用 camel 大小写

    asp.net core3.x 新增的序列号接口System.Text.Json 序列化时,如果要对所有 JSON 属性名称使用 camel 大小写 将 JsonSerializerOptions.P ...

  5. MySQL学习(3)

    一 SQL语句 1. 数据库级别(*) 显示全部数据库:show databases; 创建数据库:create database '数据库名字’; 使用数据库:use '数据库名字'; 删除数据库: ...

  6. ThinkPHP的几种路由形式总结

    本篇文章总结了ThinkPHP的几种路由形式,分别是普通模式.PATHINFO.REWRITE和兼容模式,希望对各位学习thinkphp的朋友有帮助! thinkphp官方文档里有详细的说明: Thi ...

  7. 单线程多任务协程vip电影爬取

    单线程多任务协程vip电影爬取 ​ --仅供学习使用勿作商用如有违规后果自负!!! 这几天一直在使用python爬取电影,主要目的也是为了巩固前段时间强化学习的网络爬虫,也算是一个不错的检验吧,面对众 ...

  8. TCP、UDP服务器模型 在网络程序里面,通常都是一

    TCP.UDP服务器模型 在网络程序里面,通常都是一个服务器处理多个客户机,为了出个多个客户机的请求,服务器端的程序有不同的处理方式. 目前最常用的服务器模型: 循环服务器:循环服务器在同一时刻只能响 ...

  9. OpenCV-Python 鼠标作画 | 八

    目标 了解如何在OpenCV中处理鼠标事件 您将学习以下功能:cv.setMouseCallback() 简单演示 在这里,我们创建一个简单的应用程序,无论我们在哪里双击它,都可以在图像上绘制一个圆. ...

  10. 8 个出没在 Linux 终端的诡异家伙

    这篇文章,我们一起来到 Linux 的诡异的一面-- 你知道吗?在我们日常使用的 Unix(和 Linux )及其各种各样的分支系统中,存在着一些诡异的命令或进程,它们让人毛骨悚然,有些确实是有害,但 ...