2.1 Python的序列化
Python提供两个模块来实现序列化:cPickle和pickle。这两个模块功能是一样的,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的,速度慢.
pickle.dumps()--把任意对象序列化为str,可以用于写入文件
pickle.dump()--直接把对象序列化后写入一个file-like Object
如:
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()
pickle.loads()--方法反序列化出对象
pickle.load()--方法从一个file-like Object中直接反序列化出对象
如:
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}
2.2.1 json的序列化
Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。我们先看看如何把Python对象变成一个JSON:
>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
'{"age": 20, "score": 88, "name": "Bob"}'
>>>例子socket客户端和服务器#coding:utf-8
	import json
	# 简单编码===========================================
	print json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
	# ["foo", {"bar": ["baz", null, 1.0, 2]}]
	#字典排序
	print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
	# {"a": 0, "b": 0, "c": 0}
	#自定义分隔符
	print json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=(',',':'))
	# [1,2,3,{"4":5,"6":7}]
	print json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=('/','-'))
	# [1/2/3/{"4"-5/"6"-7}]
	#增加缩进,增强可读性,但缩进空格会使数据变大
	print json.dumps({'4': 5, '6': 7}, sort_keys=True,indent=2, separators=(',', ': '))
	# {
	#   "4": 5,
	#   "6": 7
	# }
	# 另一个比较有用的dumps参数是skipkeys,默认为False。
	# dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型的话,那么会产生TypeError异常,如果开启该参数,设为True的话,会忽略这个key。
	data = {'a':1,(1,2):123}
	print json.dumps(data,skipkeys=True)
	#{"a": 1}
同理,把JSON反序列化为Python对象
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> json.loads(json_str)
{u'age': 20, u'score': 88, u'name': u'Bob'}
2.2.2 json进阶
类序列化
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
===>修改
print(json.dumps(s, default=lambda obj: obj.__dict__))
因为通常class的实例都有一个__dict__属性,它就是一个dict,用来存储实例变量。
类反序列化
def dict2student(d):
    return S(d['name'], d['age'], d['score'])
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str, object_hook=dict2student))
<__main__.Student object at 0x10cd3c190>
打印出的是反序列化的Student实例对象。
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号