前言思想:当程序运行中断后,程序中的内存变量都会被操作系统回收,如果没有存储号变量那么下次运行时将会重复上一次的开始值。所以把内存中的变量编程可以存储或者可传输的过程,就是序列化。

    将内存中的变量序列化之后,可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上,实现程序状态的保存和共享。反过来,把变量内容从序列化的对象重新读取到内存,称为反序列化。

    序列化模块
    cPickle和pickle,cPickle由c语言编写,效率比后者高。

    1. try:
    2. import cPickle as pickle
    3. except ImportError:
    4. import pickle
    5. #先导入cPICKLE,出错再导入pickle

    序列化函数:
    dumps(),dump()
    dumps()可以将任意对象序列化成一个str如下

    1. import pickle
    2. d=dict(url="index.php",title='首页',content='首页')
    3. print(pickle.dumps(d))
    4. b'\x80\x04\x954\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x03url\x94\x8c\tindex.php\x94\x8c\x05title\x94\x8c\x06\xe9\xa6\x96\xe9\xa1\xb5\x94\x8c\x07content\x94h\x04u.'

    dump()可以将序列化后的对象直接写入文件

    1. import pickle
    2. d=dict(url="index.php",title='首页',content='首页')
    3. print(pickle.dumps(d))
    4. f=open(r'dump.txt','wb')
    5. pickle.dump(d,f)
    6. f.close()

    反序列化函数
    loads(),load(),将序列化后的文件从磁盘上读取为str,然后使用loads方法将这个str反序列化为对象,或者用load方法直接将文件反序列化为对象

    1. f=open(r'dump.txt','rb')
    2. d=pickle.load(f)
    3. f.close()
    4. print(d)
    1. f=b'\x80\x04\x954\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x03url\x94\x8c\tindex.php\x94\x8c\x05title\x94\x8c\x06\xe9\xa6\x96\xe9\xa1\xb5\x94\x8c\x07content\x94h\x04u.'
    2. d=pickle.loads(f)
    3. print(d)

    假如我们想在不同的编程语言之间传递对象,把对象序列化为标准格式是关键,例如XML,但是现在更加流行的是序列化为JSON格式,既可以被所有的编程语言读取解析,也可以方便地存储到磁盘或者通过网络传输