我有一些 python 数据,序列化为泡菜,需要在 C# 程序中使用它。那么有什么方法可以在 C# 中反序列化 python 泡菜?我无法将数据格式更改为 JSON 等。
5 回答
你说你不能改变生成泡菜的程序。但是你肯定可以编写一个单独的 Python 程序来读取 pickle 并将其再次写为 JSON 吗?
import json, pickle
with open("data.pickle", "rb") as fpick:
with open("data.json", "w") as fjson:
json.dump(pickle.load(fpick), fjson)
引用自documentation
:
pickle 使用的数据格式是 Python 特定的。这样做的好处是没有外部标准施加的限制,例如 XDR(不能表示指针共享);但这意味着非 Python 程序可能无法重建腌制的 Python 对象。
所以你的问题的答案是否定的,你不能在 C# 中反序列化它。如果您需要与其他平台通信,则必须使用可互操作的格式,例如 XML 或 JSON。
您可以尝试嵌入 IronPython并从那里 unpickling,然后使 unpickled 的对象可用于 C# 应用程序。
请注意,pickle 旨在序列化Python对象,因此这种方法仅适用于您有非常简单的对象且具有与 C# 等效项的明确映射的情况。它还要求您的 IronPython 环境可以访问定义 pickle 中包含的所有对象的类的所有模块(与 CPython 中相同)。
如果可能,您应该尝试以其他更具互操作性的方式(例如 JSON 或 XML)序列化您的数据。
Pyrolite有一个 Unpickler 类,可以将泡菜变成一个对象。
现在有一个 NuGet Razorvine.Pickle,用于在 .NET 中序列化和反序列化 pickle 文件。