我如何在C#中反序列化python pickle?

时间:2013-02-17 15:31:02

标签: c# python pickle

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

5 个答案:

答案 0 :(得分:6)

你说你不能改变生成泡菜的程序。但是你肯定可以编写一个单独的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)

答案 1 :(得分:4)

来自documentation

的引用
  

pickle使用的数据格式是特定于Python的。这有   优点是外部标准没有限制   例如XDR(不能代表指针共享);但这意味着   非Python程序可能无法重建pickled Python   对象。

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

答案 2 :(得分:3)

您可以尝试embedding IronPython并从那里取消,然后将未打开的对象提供给C#应用程序。

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

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

答案 3 :(得分:1)

Pyrolite具有Unpickler类,该类会将泡菜变成对象。

答案 4 :(得分:0)

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