【问题标题】:Passing pickle strings between C# and IronPython在 C# 和 IronPython 之间传递泡菜字符串
【发布时间】:2011-11-18 18:47:17
【问题描述】:

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

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

序列化似乎可行,但反序列化失败: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. 1234563但它可能刚刚达到 Visual Studio 调试器将显示的限制。

提前致谢!

【问题讨论】:

  • 嗯:bugs.python.org/issue2980>
  • 能否发布一些显示此问题的短代码?
  • 恐怕生成我的设置所需的代码量超出了这里的合理范围。
  • 我们并不完全需要您的设置。但是一些显示相同问题的(相对)简单的代码可能会有所帮助。

标签: c# .net ironpython pickle


【解决方案1】:

简短的回答:使用protocol=-1 进行酸洗对我有用,而默认的、人类可读的协议不起作用。

长答案:看起来理论 #1 基本上是正确的。我使用大型 numpy 数组的字典来存储我的数据,即使使用默认的“人类可读”酸洗协议,它们也会被酸洗成类似二进制的形式。请注意底部的第四行(这是从一个 可以 成功取消腌制的腌制文件中提取的,但它让我了解了我在不能看到的文件中看到的内容):

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

这有可能在

链中的某处导致错误
  1. 在 IronPython 中对字符串进行酸洗
  2. 将该字符串传递给 C# 对象
  3. 使用 XmlSerializer 序列化该对象
  4. 反序列化 xml 以获取 C# 对象
  5. 将表示腌制对象的字符串传递回 IronPython
  6. 在 IronPython 中取消选择字符串

错误发生在哪里,我还不知道。我已经通过使用protocol=-1 腌制 IronPython 对象来解决这个问题,这会将对象变成可以在该过程中存活的二进制乱码字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2020-09-07
    • 2015-03-29
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多