9

我有一些 python 数据,序列化为泡菜,需要在 C# 程序中使用它。那么有什么方法可以在 C# 中反序列化 python 泡菜?我无法将数据格式更改为 JSON 等。

4

5 回答 5

9

你说你不能改变生成泡菜的程序。但是你肯定可以编写一个单独的 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)
于 2013-02-17T15:58:56.833 回答
5

引用自documentation

pickle 使用的数据格式是 Python 特定的。这样做的好处是没有外部标准施加的限制,例如 XDR(不能表示指针共享);但这意味着非 Python 程序可能无法重建腌制的 Python 对象。

所以你的问题的答案是否定的,你不能在 C# 中反序列化它。如果您需要与其他平台通信,则必须使用可互操作的格式,例如 XML 或 JSON。

于 2013-02-17T15:34:25.090 回答
3

您可以尝试嵌入 IronPython并从那里 unpickling,然后使 unpickled 的对象可用于 C# 应用程序。

请注意,pickle 旨在序列化Python对象,因此这种方法仅适用于您有非常简单的对象且具有与 C# 等效项的明确映射的情况。它还要求您的 IronPython 环境可以访问定义 pickle 中包含的所有对象的类的所有模块(与 CPython 中相同)。

如果可能,您应该尝试以其他更具互操作性的方式(例如 JSON 或 XML)序列化您的数据。

于 2013-02-17T15:54:15.657 回答
2

Pyrolite有一个 Unpickler 类,可以将泡菜变成一个对象。

于 2019-04-09T19:40:22.497 回答
0

现在有一个 NuGet Razorvine.Pickle,用于在 .NET 中序列化和反序列化 pickle 文件。

于 2020-09-16T00:46:13.780 回答