【发布时间】:2013-02-17 15:31:02
【问题描述】:
我有一些 python 数据,序列化为泡菜,需要在 C# 程序中使用。那么有什么方法可以在 C# 中反序列化 python 泡菜?我无法将数据格式更改为 JSON 等。
【问题讨论】:
我有一些 python 数据,序列化为泡菜,需要在 C# 程序中使用。那么有什么方法可以在 C# 中反序列化 python 泡菜?我无法将数据格式更改为 JSON 等。
【问题讨论】:
你说你不能改变生成泡菜的程序。但是你肯定可以编写一个单独的 Python 程序来读取泡菜并将其再次写为 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。
【讨论】:
您可以尝试embedding IronPython 并从那里取消腌制,然后将取消腌制的对象提供给 C# 应用程序。
请注意,pickle 旨在序列化 Python 对象,因此这种方法仅适用于您有非常简单的对象且具有明确映射到 C# 等效项的情况。它还要求您的 IronPython 环境可以访问定义 pickle 中包含的所有对象的类的所有模块(与 CPython 中相同)。
如果可能,您应该尝试以其他更具互操作性的方式(例如 JSON 或 XML)序列化您的数据。
【讨论】:
Pyrolite 有一个 Unpickler 类,可以将泡菜变成一个对象。
【讨论】:
现在有一个 NuGet Razorvine.Pickle,用于在 .NET 中序列化和反序列化 pickle 文件。
【讨论】: