python,序列化

序列化:

变量从内存中变成可存储或传输的过程

在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等

反序列化(unpickling):

变量内容从序列化的对象重新读到内存里

import pickle
d = dict(name='Bob', age=20, score=88)
pickle.dumps(d)
#结果
b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'

'''pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。
或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object'''
f = open('dump.txt', 'wb')
pickle.dump(d, f)
f.close()

#反序列化,pickle.loads()/load()
 f = open('dump.txt', 'rb')
d = pickle.load(f)
f.close()
d
{'age': 20, 'score': 88, 'name': 'Bob'}

 若在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便

JSON

Python内置的json模块提供了非常完善的Python对象到JSON格式的转换

#str与JSON的字符串之间转换

import json
d = dict(name='Bob', age=20, score=88)
json.dumps(d)
#方法返回一个str
'{"age": 20, "score": 88, "name": "Bob
#反序列化
json.loads(json_str)
{'age': 20, 'score': 88, 'name': 'Bob'}

类的处理

import json

d = dict(name='Bob', age=20, score=88)
data = json.dumps(d)
print('JSON Data is a str:', data)
reborn = json.loads(data)
print(reborn)

class Student(object):

    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    def __str__(self):
        return 'Student object (%s, %s, %s)' % (self.name, self.age, self.score)

s = Student('Bob', 20, 88)
std_data = json.dumps(s, default=lambda obj: obj.__dict__)
print('Dump Student:', std_data)
rebuild = json.loads(std_data, object_hook=lambda d: Student(d['name'], d['age'], d['score']))
print(rebuild)

 

posted @ 2017-06-26 22:46  x.cube  阅读(173)  评论(0编辑  收藏  举报