Передача строк рассола между C # и IronPython - PullRequest
4 голосов
/ 18 ноября 2011

Я написал пакет IronPython для некоторого перебора данных, и теперь я оборачиваю его в приложение C #. Частью функциональности приложения является сохранение состояния проекта, а затем восстановление этого сохраненного состояния.

Я использую модуль pickle в IronPython, чтобы сохранить объект класса из моего пользовательского пакета. До того, как я сделал перенос в C #, это не было проблемой: я использовал функцию pickle.dump() для сериализации объекта в файл. Теперь я хочу использовать функцию pickle.dumps() для сериализации объекта в строку, затем передать эту строку объекту C # и сериализовать THAT объект с XmlSerializer.

Сериализация, кажется, работает, но десериализация выходит из строя: C # получает десериализованную строку и передает ее 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) и посмотрю на строку перед ее передачей в IronPython для снятия отметки, то, что я вижу, недостаточно для представления всего объекта. Но он может просто достичь предела того, что будет отображаться отладчиком Visual Studio.

Заранее спасибо!

1 Ответ

0 голосов
/ 19 ноября 2011

Краткий ответ: травление с помощью protocol=-1 работает для меня, когда стандартный, читаемый человеком протокол не работает.

Длинный ответ: похоже, теория № 1 в основном верна.Я использую словарь больших массивов для хранения моих данных, и даже используя стандартный «читаемый человеком» протокол протравливания, они протравливаются в бинарную форму.Обратите внимание на четвертую строку снизу (это извлечено из маринованного файла, который может быть может быть успешно удален, но он дает представление о том, что я вижу в файлах, которые не могут):

(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

Где именно произошла ошибка, я пока не знаю.Я обошел проблему, выбрав объект IronPython с помощью protocol=-1, который превращает объект в строку двоичного кода, который может пережить процесс.

...