gpt4 book ai didi

c# - 在 C# 和 IronPython 之间传递 pickle 字符串

转载 作者:行者123 更新时间:2023-11-30 13:04:38 25 4
gpt4 key购买 nike

我编写了一个 IronPython 程序包来进行一些数据处理,现在我将其包装在 C# 应用程序中。该应用程序的部分功能是保存项目状态,然后恢复保存的状态。

我在 IronPython 中使用 pickle 模块从我的自定义包中保存一个类的对象。在我用 C# 进行包装之前,这没有问题:我使用 pickle.dump() 函数将对象序列化到一个文件中。现在我想使用 pickle.dumps() 函数将对象序列化为字符串,然后将该字符串传递给 C# 对象并使用 序列化 THAT 对象>XmlSerializer.

序列化似乎有效,但反序列化失败了:C# 获取反序列化的字符串并将其传递给 IronPython,IronPython 应该能够使用 pickle.loads() 函数重构原始对象,但是而是引发此错误:

System.Collections.Generic.KeyNotFoundException {"ô"}

你能帮我解决这个问题吗?我有两个理论:

  1. 也许 IronPython 和 C# 之间或 C#、IronPython 之间的字符串编码存在差异,以及 pickle 模块所期望的内容?

  2. 一开始并没有序列化整个字符串,所以我只是将废话传递给 pickle.loads()

使我得出这些理论的证据:

  1. 错误消息 (ô) 中缺少的键看起来有点像 unicode-parsed-as-ASCII-text。

  2. 如果我中断执行(在 Visual Studio 2010 的 Debug模式下)并在将字符串传递给 IronPython 进行拆解之前查看它,我看到的长度不足以表示整个对象。但它可能刚好达到 Visual Studio 调试器将显示的内容的限制。

提前致谢!

最佳答案

简短回答:使用 protocol=-1 进行 pickle 对我来说适用于默认的、人类可读的协议(protocol)不适用的地方。

长答案:看起来理论 1 基本上是正确的。我使用大型 numpy 数组的字典来存储我的数据,甚至使用默认的“人类可读” pickle 协议(protocol),它们被 pickle 为类似二进制的形式。注意倒数第四行(这是从一个可以成功解封的pickled文件中提取的,但它给出了我在不能成功解封的文件中看到的内容):

(g10
(I0
tp25
g12
tp26
Rp27
(I1
(I2
tp28
g19
I00
Vq=\u000a×£°(@R¸\u2026ëQ.@
p29
tp30
bssb.

这有可能导致链中某处出错

  1. 在 IronPython 中 pickle 字符串
  2. 将该字符串传递给 C# 对象
  3. 使用 XmlSerializer 序列化该对象
  4. 反序列化 xml 以取回 C# 对象
  5. 将表示已 pickle 对象的字符串传回 IronPython
  6. 在 IronPython 中解开字符串

具体是哪里出错了,我还不知道。我通过使用 protocol=-1 对 IronPython 对象进行 pickle 来解决这个问题,这会将对象变成可以在该过程中存活的二进制乱码字符串。

关于c# - 在 C# 和 IronPython 之间传递 pickle 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8187509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com