【问题标题】:How I can deserialize python pickles in C#?如何在 C# 中反序列化 python 泡菜?
【发布时间】:2013-02-17 15:31:02
【问题描述】:

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

【问题讨论】:

    标签: c# python pickle


    【解决方案1】:

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

    【讨论】:

    • 我的 pickle 文件包含来自 sklearn 的模型。我收到此错误:TypeError:“LinearSVC”类型的对象不是 JSON 可序列化的。有没有办法序列化它?
    【解决方案2】:

    引用自documentation

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我们从我工作的 C# 运行 Python 脚本。我不记得您需要的确切程序集名称(我认为是 Microsoft.Scripting)。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-07
          • 2015-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多