• 序列化


    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实例对象。

  • 相关阅读:
    WCF、WebAPI、WCFREST、WebService之间的区别
    常见的排序方法
    PHP中日期时间函数date()用法总结
    controller中获取全局配置111
    Zf2 自定义组件库如何设置
    module/config/module.config.php文件内涵定义
    zf2环境设置
    菜菜鸟Zend Framework 2 不完全学习涂鸦(四)-- 模块
    菜菜鸟Zend Framework 2 不完全学习涂鸦(三)-- 例子功能设置
    菜菜鸟Zend Framework 2 不完全学习涂鸦(二)-- 类库共享
  • 原文地址:https://www.cnblogs.com/giotto95827/p/8761118.html
Copyright © 2020-2023  润新知