0

0

C# Python Pickle文件读取 C#能否安全地解析Python序列化的pickle文件

畫卷琴夢

畫卷琴夢

发布时间:2026-03-18 14:28:31

|

246人浏览过

|

来源于php中文网

原创

Python pickle文件不兼容C#,因其是Python专属协议,依赖CPython内部结构;C#无安全解析器,易致崩溃或静默错误;应改用JSON、Protobuf等跨语言格式,或通过Python子进程桥接转换。

c# python pickle文件读取 c#能否安全地解析python序列化的pickle文件

Python pickle 文件本质不兼容 C#

不能安全解析。Python 的 pickle 协议是 Python 专属的二进制序列化格式,依赖 CPython 运行时的内部对象结构、模块路径、甚至类定义的内存布局。C# 没有对应解析器,也没有等价的反序列化引擎——这不是“缺个库”的问题,而是协议层就不互通。

常见错误现象包括:InvalidDataExceptionEndOfStreamException、字节流开头出现乱码(如 \x80\x04)后直接崩溃,或更危险的——看似成功反序列化出对象,但字段值错乱、类型被强转、方法调用静默失败。

为什么别尝试用第三方 C# “pickle 解析器”

历史上存在过几个实验性项目(如 PickleDotNet),但它们只支持极老的 pickle 协议版本(v0–v2),且无法处理任何含自定义类、闭包、lambda、numpy 数组或非 ASCII 模块路径的对象。一旦 Python 端用了 pickle.HIGHEST_PROTOCOL(当前默认是 v5),C# 端基本必然失败。

  • Python 3.8+ 默认用 protocol 5,含 out-of-band 数据块,C# 无标准解包逻辑
  • 所有 pickle 解析器都需执行 Python 字节码(INST 指令)或动态导入模块,C# 无法安全复现该行为
  • 即便硬解析成功,__reduce__ 返回的可调用对象在 C# 中无对应实现,会抛 NotSupportedException

真正可行的替代方案:换协议,不换逻辑

如果必须跨语言共享数据,应让 Python 改用语言中立格式输出,C# 对应读取。这不是妥协,而是必要隔离。

立即学习Python免费学习笔记(深入)”;

一点PPT
一点PPT

一句话生成专业PPT,AI自动排版配图

下载
  • 优先选 json:Python 端用 json.dump(),C# 用 System.Text.Json.JsonSerializer.Deserialize<T>();注意避开 datetimebytesset 等非 JSON 原生类型
  • 结构复杂或需二进制效率时,用 protobuf:双方共用 .proto 文件,生成各自语言的绑定类;Python 用 protobuf 包,C# 用 Google.Protobuf NuGet 包
  • 临时调试可用 msgpack:比 JSON 更紧凑,C# 有成熟库 MsgPack.Cli,Python 用 msgpack;但注意它也不支持任意 Python 对象,仍需预定义 schema 或手动转换

如果只能拿到现成的 .pkl 文件且无法改 Python 端

唯一安全做法是用 Python 进程做桥接:C# 启动一个短生命周期的 python.exe 子进程,传入文件路径,由 Python 脚本加载 pickle 并转成 JSON 输出到 stdout,C# 捕获并解析 JSON。

示例关键点:

  • Python 脚本里必须加 try/except 包裹 pickle.load(),防止恶意 payload 触发任意代码执行
  • C# 启动进程时设 UseShellExecute = false,避免 shell 注入
  • 不要把 pickle 文件路径拼进命令行字符串,改用 stdin 传内容(更安全)或用临时文件 + 随机命名
  • 别忽略编码:Python 输出 JSON 时指定 ensure_ascii=False,C# 读取时用 Encoding.UTF8

跨语言边界时,序列化协议的选择不是性能问题,而是信任边界问题。Pickle 就是 Python 进程内的“私语”,拿出去说,没人听得懂,硬听还可能被误导。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

458

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

84

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1571

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

652

2023.11.24

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

3

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号