序列化和反序列化的定义

序列化和反序列化的定义

  • 序列化:把不可传输的对象转换成可存储或可传输的过程
  • 反序列化:把磁盘等介质中的数据转换成对象

pickle模块(二进制格式之间的转换)

序列化:dump(object)和dumps(object)
反序列化:load(bytes)和loads(bytes)
不带s的是(反)序列化二进制文件,带s的是(反)序列化对象

1. dumps()和loads()对对象进行存储

>>> import pickle
>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> b = pickle.dumps(dict1)
>>> b
b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01K\x01X\x01\x00\x00\x00bq\x02K\x02X\x01\x00\x00\x00cq\x03K\x03u.'
>>> type(b)

>>> c = pickle.loads(b)
>>> c
{'a': 1, 'b': 2, 'c': 3}
>>> type(c)

2. dump()和load()对文件进行操作,由于pickle写入的二进制数据,所以打开方式需要以"wb"和"rb"的模式

>>> import pickle
>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> file1 = open('test.txt', 'wb')
>>> pickle.dump(dict1, file1)
>>> file1.close()
>>> file2 = open('test.txt', 'rb')
>>> file2
<_io.BufferedReader name='test.txt'>
>>> pickle.load(file2)
{'a': 1, 'b': 2, 'c': 3}
>>> file2.close()
>>> id(file1)
1822579928584
>>> id(file2)
1822579928936

注意:结果说明反序列化后的对象不是原来的对象了

json模块(字符串之间的转换)

json和python之间的数据类型对应关系

1. python转json

python JSON
dict object
list / tuple array
str string
int / float / enums numbers
None null
True true
False false

2. json转python

JSON python
object dict
array list
string str
number(int) int
number(rel) float
true True
false False
null None

3. 说明

  • Python dict中的非字符串key被转换成JSON字符串时都会被转换为小写字符串;
  • Python中的tuple,在序列化时会被转换为array,但是反序列化时,array会被转化为list;
  • 由以上两点可知,当Python对象中包含tuple数据或者包含dict,且dict中存在非字符串的key时,反序列化后得到的结果与原来的Python对象是不一致的;
  • 对于Python内置的数据类型(如:str, unicode, int, float, bool, None, list, tuple, dict)json模块可以直接进行序列化/反序列化处理;对于自定义类的对象进行序列化和反序列化时,需要我们自己定义一个方法来完成定义object和dict之间进行转化。

4. 使用方式

json.dumps :从字典(可序列化json的对象)转换为json格式数据
json.loads :从json格式数据转到python字典类型
json.dump : 将json格式的字符串写入到文件中
json.load :从文件中读取字符串

参数:default :就是把任意一个对象变成一个可序列化的json对象

​ intent:自定义格式化

不带s的是file文件中使用的

5. 序列化字符串

>>> import json
>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> a = json.dumps(dict1)
>>> a
'{"a": 1, "b": 2, "c": 3}'
>>> b = json.loads(a)
>>> b
{'a': 1, 'b': 2, 'c': 3}
>>> type(a)

>>> type(b)

>>> a = json.dumps(dict1, indent=3)
>>> a
'{\n   "a": 1,\n   "b": 2,\n   "c": 3\n}'
>>>

现在我们想序列化一个类,如下使用相同的json.dumps(ball)序列化下面ball的对象会出现以下错误

TypeError: Object of type 'Ball' is not JSON serializable

正确的处理方法要把对象转换为可序列化json的对象,所以要使用关键字参数default和定义一个转换函数去处理

class Ball:
    def __init__(self, color):
        self.color = color

ball = Ball("red")
def ball2idict(bal):
    return {
        "color": bal.color
    }

def dict2ball(odict):
    return Ball(odict["color"])
    
objdumps = json.dumps(ball, default=ball2idict)
objloads = json.loads(objdumps, object_hook=dict2ball)
print(objdumps)# 1
print(objloads)# 2
输出结果:
1 {"color": "red"}
2 <__main__.Ball object at 0x0000025DCDDD2630>

6. 存储为json文件

In [4]: content = {'name': '张飞', 'age': 20}

In [5]: with open('test.txt', 'w', encoding='utf-8') as f:
   ...:     json.dump(content, f)
   ...:

In [6]: with open('test.txt', 'r', encoding='utf-8') as f:
   ...:     data = json.load(f)
   ...:     print(data)
   ...:
   ...:
{'name': '张飞', 'age': 20}

In [7]: data
Out[7]: {'name': '张飞', 'age': 20}

In [8]: type(data)
Out[8]: dict

你可能感兴趣的:(Python基础)