序列化

作者: 噜噜迅儿 | 来源:发表于2018-05-26 23:13 被阅读0次

    我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

    序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

    反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

    pickle

    ## 序列化
    ##  pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件
    >>> import pickle
    >>> d = dict(name='Bob', age=20, score=88)
    >>> pickle.dumps(d)
    b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00Bobq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x05\x00\x00\x00scoreq\x04KXu.'
    
    ## 另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object
    >>> f = open('dump.txt', 'wb')
    >>> pickle.dump(d, f)
    >>> f.close()
    
    ## 反序列化
    ## 当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象
    f = open('dump.txt', 'rb')
    pickle.loads(f.read())
    f.close()
    d
    
    ## 也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象
    f = open('dump.txt', 'rb')
    d = pickle.load(f)
    f.close()
    d
    

    JSON

    dumps()方法返回一个str,内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个file-like Object

    ## 序列化
    ## 把Python对象变成一个JSON
    import json
    d = dict(name='Bob', age=20, score=88)
    json.dumps(d)
    
    f = open('dump.txt', 'w')
    json.dump(d, f)
    f.close()
    
    ## 反序列化
    import json
    json_str = '{"age": 20, "score": 88, "name": "Bob"}'
    d = json.loads(json_str)
    type(d)
    
    f = open('dump.txt', 'r')
    d = json.load(f)
    type(d)
    

    JSON进阶

    import json
    
    class Student(object):
        def __init__(self, name, age, score):
            self.name = name
            self.age = age
            self.score = score
    
    def student2dict(std):
        return {
            'name': std.name,
            'age': std.age,
            'score': std.score
        }
    
    s = Student('Bob', 20, 88)
    ## Student实例首先被student2dict()函数转换成dict,然后再被顺利序列化为JSON
    json.dumps(s, default=student2dict)
    ## 通常class的实例都有一个__dict__属性,它就是一个dict,用来存储实例变量。也有少数例外,比如定义了__slots__的class。
    json.dumps(s, default=lambda obj: obj.__dict__)
    json.dumps(s.__dict__)
    
    ## 要把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"}'
    json.loads(json_str, object_hook=dict2student)
    
    # -*- coding: utf-8 -*-
    import json
    obj = dict(name='小明', age=20)
    s = json.dumps(obj, ensure_ascii=False)
    s = json.dumps(obj, ensure_ascii=True)
    
    ## 测试
    '{"name": "小明", "age": 20}'
    '{"name": "\\u5c0f\\u660e", "age": 20}'
    

    小结

    Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。

    相关文章

      网友评论

        本文标题:序列化

        本文链接:https://www.haomeiwen.com/subject/gbsvjftx.html