zoukankan      html  css  js  c++  java
  • Python3序列化和反序列化实现

    一、说明

    早上看到Python使用pickle进行序列化和反序列化,然后发现面临的一个获取不到返回值的框架,似乎可以通过在框架中先序列化,然后在外部进行反序列化的方法来实现。就研究了一下pickle库的具体使用。

    本身也没什么复杂,一方面还是怕忘记,另一方面是自从学Java听到反序化这个词开始就有一种莫明其妙的恐具感总觉得是什么高大上的东西。Java反序列化可参见“Java反序列化漏洞实现”。

    二、代码实现

    import pickle
    
    
    class BeSerializing:
        def __init__(self):
            self.var = "a test string."
    
        def print_var(self):
            print(f"self var value is:{self.var}")
    
    
    class Serializing:
        def do_serializing(self):
            obj = BeSerializing()
            # with的好处是会最后自动释放获取的资源,对于文件就是最后会自己close()
            with open("test_pickle.obj", "wb") as file_handler:
                # 序列化,将对象写到文件
                pickle.dump(obj, file_handler)
    
    
    class DeSerializing:
        def do_serializing(self):
            with open("test_pickle.obj", "rb") as file_handler:
                # 反序列化,将对象从文件中还原
                # 注意,虽然python的变量不需要使用前先定义类型,但使用时是要被格式化成确定类型的
                # 所以,如果反序列化类和被序列化类不在同一文件中,那么需要将被序列化类import进来,不然会因找不到被反序列化类而反序列化失败
                obj = pickle.load(file_handler)
                print(f"obj type: {type(obj)}
    "
                      f"obj.var value: {obj.var}")
    
    
    if __name__ == "__main__":
        obj_se = Serializing()
        obj_se.do_serializing()
        obj_de = DeSerializing()
        obj_de.do_serializing()

    运行结果如下,可以看到成功反序列化并打印出被序列化的对象的变量的值:

    参考:

    https://docs.python.org/3/library/pickle.html

  • 相关阅读:
    Dictionary(二)
    LoveTao项目源码共享
    小功能天气预报
    对XML的收集3
    小小练习:对XML的处理
    对XML的收集4
    对XML的收集2
    小小练习:测试获取用户信息接口
    大学生免费自学各种技术网址大全 不要再报班了
    DevComponents.AdvTree 相关笔记
  • 原文地址:https://www.cnblogs.com/lsdb/p/12561055.html
Copyright © 2011-2022 走看看