在Python中防止某些字段被Pickle序列化

在Python中,如果你想防止某些字段被pickle序列化,可以使用__reduce__()方法来自定义pickle行为。__reduce__()方法允许你返回一个元组,其中包含要在对象被pickle时调用的函数以及传递给该函数的参数。下面就是我遇到的问题以及最终解决方案。

在这里插入图片描述

1、问题背景

在使用 Python 的 Pickle 模块对对象进行序列化时,我们有时希望排除某些字段,以防止其被序列化。这可能是由于这些字段包含敏感信息,或者只是因为它们是临时变量,不应被持久化。

2、解决方案

有几种方法可以防止某些字段被 Pickle 序列化。

  1. 使用 __getstate____setstate__ 方法

__getstate____setstate__ 是 Python 内置的特殊方法,可以让我们自定义对象的序列化和反序列化行为。我们可以通过重写这些方法来控制哪些字段被序列化。

class Something(object):def __init__(self):self._thing_id = 0self._cached_thing = Nonedef __getstate__(self):# 只序列化 `_thing_id` 字段return {'_thing_id': self._thing_id}def __setstate__(self, state):# 从 `state` 中恢复 `_thing_id` 字段self._thing_id = state['_thing_id']
  1. 使用 __getnewargs____getnewargs_ex__ 方法

__getnewargs____getnewargs_ex__ 是 Python 内置的特殊方法,可以让我们在序列化对象时传递自定义参数。我们可以通过重写这些方法来控制哪些字段被序列化。

class Something(object):def __init__(self, thing_id):self._thing_id = thing_idself._cached_thing = Nonedef __getnewargs__(self):# 只传递 `_thing_id` 参数return (self._thing_id,)def __getnewargs_ex__(self):# 只传递 `_thing_id` 参数return (self._thing_id,), {}
  1. 使用 __reduce__ 方法

__reduce__ 是 Python 内置的特殊方法,可以让我们自定义对象的序列化行为。我们可以通过重写这个方法来控制哪些字段被序列化。

class Something(object):def __init__(self, thing_id):self._thing_id = thing_idself._cached_thing = Nonedef __reduce__(self):# 只返回 `_thing_id` 参数return (self.__class__, (self._thing_id,), {})
  1. 使用 _blacklist 变量

我们可以使用 _blacklist 变量来指定哪些字段不应被序列化。在 __getstate__ 方法中,我们可以使用这个变量来过滤掉不需要序列化的字段。

class Something(object):def __init__(self, thing_id):self._thing_id = thing_idself._cached_thing = None# 黑名单_blacklist = ['_cached_thing']def __getstate__(self):# 只序列化除 `_blacklist` 中的字段以外的所有字段return {k: v for k, v in self.__dict__.items() if k not in self._blacklist}
  1. 使用命名约定

为了避免在每个类中都指定 _blacklist 变量,我们可以使用命名约定来标记哪些字段不应被序列化。例如,我们可以将不应被序列化的字段命名为 _cached_xxx。这样,我们在 __getstate__ 方法中就可以直接过滤掉所有以 _cached_xxx 开头的字段。

class Something(object):def __init__(self, thing_id):self._thing_id = thing_idself._cached_thing = Nonedef __getstate__(self):# 只序列化除了以下列 "_cached_" 开头的字段之外的所有字段return {k: v for k, v in self.__dict__.items() if not k.startswith('_cached_')}

在这个示例中,MyClass类有两个字段:sensitive_datanon_sensitive_data。我们通过定义__reduce__()方法来指定pickle时应该调用的函数。在这个函数中,我们只传递了non_sensitive_data字段,而忽略了self.sensitive_data字段,从而防止了敏感数据被pickle序列化。

我们可以根据实际需求自定义__reduce__()方法来选择哪些字段需要被pickle序列化,哪些字段不需要。

如果有任何问题可以留言讨论交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2D Chests Assets - Mega Pack

科幻/奇幻/经典主题的箱子和容器。AAA质量,高分辨率,VFX,源PSD文件。 这是一个带有手绘套装的大包装: -【梦幻之栗】 -【科幻钱包】 AAA质量。高分辨率。一切都已准备就绪,可供使用。包括PSD文件。 在1.1版本中添加了VFX并将项目更新为URP。请注意,新的VFX仅适用于URP/HD…

C# WinForm —— 20 RichTextBox 介绍

1. 简介 富文本框,拥有TextBox的所有功能,,但还有更多高级的文本输入和编辑功能,比如设置字体颜色、样式、段落、图片、超链接等 2. 常用属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般以 rtxt 开头Acce…

Python中的数据可视化:填充等高线图matplotlib.pyplot.contourf()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 Python中的数据可视化: 填充等高线图 matplotlib.pyplot.contourf() [太阳]选择题 关于代码描述正确的是? import matplotlib.pyplot as plt import numpy as np x …

java数据结构与算法(二叉树前序遍历)

前言 二叉树的前序遍历是一种特定的遍历方法,按照根节点、左子树、右子树的顺序进行遍历。和中序遍历和后续遍历类似,只是先将遍历到的根节点先做输出。 实现原理 前序遍历的具体过程如下: 前序遍历是一种用于二叉树的遍历方式&#xff0…

【奈学科技】P7大前端架构师1期

课程概述 一门专为有志于成为大前端架构师人群量身打造的课程。课程内容深度剖析大前端架构各环节核心架构(组件化架构、微内核架构、微前端架构、前后端分离架构)并对其进行排列组合形成大前端全局架构观以及培养架构师必备的架构思维模型。史无前例的…

基于若依的ruoyi-vue3.8.7的flowable支持指定接收人的流程审批前端部分

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

基于BF算法和KMP算法的病毒感染检测

案例引入: 实验任务: 代码实现: 注意:我以项目的形式编写此代码,编译环境为VS2022,代码移植可能会导致错误 mystring.h:存放结构体以及函数声明 #define _CRT_SECURE_NO_WARNINGS #pragma on…

在电脑本地运行llama3-8b模型

文章目录 流程我的案例api调用llama.cpp 流程 ollama支持可运行的模型,图片这里只是一部分而已,只需要下载下面的软件和模型文件,即可直接运行,而无需配置其他 模型文件下载地址 https://ollama.com/library 支持的部分模型,实际上更多,这里只是显示部分 登陆ollama官网 htt…

cpu卡片详解(FM1208)

​ 目录 ​1. 引言 1.1 FM1208 CPU卡芯片 2. FM1208 CPU卡芯片概述 2.1 FM1208及其在智能卡中的作用 2.2 FM1208功能框图 3.FM1208的技术规格 4.FM1208工作流程 5.FM1208文件结构 6.FM1208与其他智能卡技术的比较 7.FM1208安全特性 7.1 DES/…

解决kali Linux2024无法获取动态IPv4地址(DHCP)解决方案

用root用户启动终端 进入根目录,选择配置文件 cd到根目录下/../etc/network找到interfaces文件 编辑interfaces文件 vi interfaces,编辑interfaces文件 输入如下命令 打开虚拟网络编辑器 选择虚拟机选项卡,编辑,打开虚拟网络编…

C语言笔记17

指针4 1.数组与指针笔试题型 //1.一维数组 int main1() {int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a)); //16 特例: sizeof(数组名) 表示数组的空间大小printf("%d\n", sizeof(a + 0)); //第一个元素地址: 4(32位系统)/8(64位系统)printf(&q…

广西壮族自治区工程系列生态环境行业技术资格评审条件

广西壮族自治区工程系列生态环境行业技术资格评审条件评审文件链接广西壮族自治区人力资源和社会保障厅网站评审工作的通知关于开展2023年度工程系列生态环境行业职称评审工作的通知 - 职称评审 - 广西壮族自治区生态环境厅网站类别基本条件业绩成果论文、著作条件工程师一、获…

织梦dedecms企业网站模板安装教程

很多新手在拿到织梦模板后不知道如何安装,所以,云部落(Yunbuluo.Net)资源网专门整理了一份图文版织梦模板通用安装教程,希望对大家有所帮助。 第一步: 将域名解析绑定好之后,上传下载的模板至您的WEB根目录中&#xf…

JavaScript与数据库MongoDB的梦幻联动:打造高效的数据驱动应用-【代码示例】

JavaScript与数据库MongoDB的梦幻联动:打造高效的数据驱动应用【代码示例】 一、基本概念与作用1. JavaScript2. MongoDB 二、JavaScript与MongoDB的联动1. 环境准备2. 连接到MongoDB3. 定义数据模型4. 数据操作插入数据查询数据更新数据删除数据 三、性能与安全考虑…

【再探】设计模式—桥接模式、组合模式及享元模式

结构型设计模式描述了对象与类之间的关系。适配器模式及装饰器模式主要用于接口适配及功能增强,而桥接模式模式则是为了减少类的数量,组合模式让部分与容器能被客户端统一对待处理,享元模式则是用于节约系统内存,提高系统性能。 …

机器学习之sklearn基础教程(第五篇:特征选择和降维)

机器学习之sklearn基础教程(第五篇:特征选择和降维) 1. 特征选择 特征选择是从原始特征集中选择对任务有用的特征的过程。选择正确的特征可以提高模型的性能、减少训练时间和复杂度,并帮助我们更好地理解数据。 以下是几种常见的…

52. UE5 RPG 应用自定义FGameplayEffectContext到项目

在前面一篇文章中,我们创建了自定义的FGameplayEffectContext结构体,用于存储所需的内容。在自定义的结构体内,我们主要是为了增加暴击和格挡两个参数,用于后面的UI显示给玩家,让玩家知道当前触发的状态。并且我们还对…

分布式与一致性协议之PBFT算法(一)

PBFT算法 概述 前面提到了拜占庭将军问题之后,有人可能会感到困惑:口信消息型拜占庭问题直接在实际项目中是如何落地的呢?事实上,它很难在实际项目中落地,因为口信消息型拜占庭问题之解是一个非常理论化的算法,没有与…

区块链数据集(一)Xblock

一、Transaction Datasets Ethereum On-chain Data [Dataset] 2021-10TransactionData/Code AvailableEthereum Introduction: This is the dataset of paper “XBlock-ETH: Extracting and Exploring Blockchain Data From Ethereum”. Data / Code Paper CiteDownloads: …

【Python大数据】PySpark

CSDN不支持多个资源绑定,另外两个数据文件下载: 订单数据-json.zip search-log.zip Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎 简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服…