zoukankan      html  css  js  c++  java
  • 序列化、持久化

    通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长。并且需要时可以再次将这个对象读取出来。Python中有几个常用模块可实现这一功能。

    json模块:

    序列化:

    import json

    info = {
    'name':'alex',
    'age':22
    }


    f = open("test.txt","w")
    print(json.dumps(info))

    json.dump(info,f) #等于 f.write( json.dumps( info) )

    f.close()
    反序列化:

    import json

    def sayhi(name):
    print("hello2,",name)


    f = open("test.txt","r")


    data = json.load(f) #等于 data = json.loads(f.read())

    print(data)
    注意:
    dumps 和loads一起使用
    dump和load一起使用
    虽然混合也能使用,为了规范吧。

    json是可以把跨语言使用,可以在Java,Python,c++等,接受他们语言的数据然后序列化。json只能处理简单的数据;
    json模块主要用于处理json格式的数据,可以将json格式的数据转化为python的字典,便于python处理,同时也可以将python的字典或列表等对象转化为json格式的数据,便于跨平台或跨语言进行数据交互

    pickle模块:
    序列化:
    import pickle

    def sayhi(name):
    print("hello,",name)

    info = {
    'name':'alex',
    'age':22,
    'func': sayhi    #json处理不了函数的地址

    }


    f = open("test.txt","wb")
    print(pickle.dumps(info))
    pickle.dump(info,f) #等于 f.write( pickle.dumps( info) )

    f.close()

    反序列化:
    import pickle

    def sayhi(name):
    print("hello2,",name)


    f = open("test.txt","rb")

    data = pickle.load(f) #等于 data = pickle.loads(f.read())

    data["func"]("Alex")



    注意:

    说明:序列化和反序列化是在两个Python文件中写的;

    在序列化中sayhi函数的地址,在运行完后sayhi就释放了;
    我们反序列化,需要sayhi的地址,所以在反序列化的文件代码里写了一个sayhi的函数,反序列化,找的是反序列化代码文件中的内存地址,而不是序列化中sayhi的内存地址.

    pickle.dumps 和json.dumps功能一样,但是以字节(bytes)对象形式返回封装的对象;json是以str处理数据的;
    pickle.loads和json.loads功能一样,但是从字节(bytes)对象中读取被封装的对象,并返回;json是以str处理数据的;

    pickle 是 python专有,更适合处理复杂类型的序列化;
    --------------------------------------------------------------------
    shelve模块:
    shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式。

    shelve存储例子:
    import shelve
    import datetime
    d = shelve.open('shelve_test') # 打开一个文件
    info = {'age':22,"job":'it'}
    name = ["alex", "rain", "test"]
    d["name"] = name # 持久化列表
    d["info"] = info # 持久化dict
    d['date'] = datetime.datetime.now() #持久化时间
    d.close()

    shelve获取存储的内容:
    import shelve
    import datetime
    d = shelve.open('shelve_test') # 打开一个文件
    print(d.get("name"))
    print(d.get("info"))
    print(d.get("date"))

    
    

    序列化:把对象转换为字节序列的过程称为对象的序列化

    反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

    对象只有在序列化之后才能进行持久化存储,从持久化存储介质加载的数据通过反序列化转变成运行时对象。
    持久化就是把内存中的对象保存到外存中,让以后能够取回。而保存和取回的过程就是经过序列化和对象io完成的。

    比如一个变量,储存到硬盘,硬盘是二进制格式,变量->二进制转换(序列化)->写入硬盘(持久化).

    参考:https://www.cnblogs.com/pycode/p/5575342.html


  • 相关阅读:
    setlocale set the current locale
    测试一个目录下的文件共有多少行
    ping中用到的校验和算法
    atomic integer operations P176
    我要理解1为什么是0xffffffff,所以写了下面的程序理解。
    贝叶斯网络中一个节点的类
    bash 的浮点除法
    shell(1)
    AndroidBroadcast详解与汇总
    AndroidActivity详解与汇总
  • 原文地址:https://www.cnblogs.com/lighthouse/p/9541801.html
Copyright © 2011-2022 走看看