2013-08-14 4 views
0

У меня есть следующий объект карты Ruby, сериализованный на одном конце и полученный на другом. Когда он получен в целевой точке, мне нужно оценить его обратно на тот же объект карты, что и оригинал, и выполнить некоторую обработку.Почему возникает ошибка при десериализации объекта Ruby?

Тем не менее, оценка цели не работает с «синтаксической ошибкой, неожиданным $ end» msg.

Он не работает, потому что символ :application относится к объекту UploadIO.

Учитывая, что я могу изменить код только в том месте, где я получаю сериализованный объект, как наилучшим образом решить проблему? Преобразуйте значение :application в строку или используйте какой-либо другой трюк?

eval (' 
{"component"=>"CF", 
    "body"=> 
    ["PUT", 
    "v2/apps/269e739c-5d08-429c-8682-d3200b79283b/bits", 
    {:payload=> 
     { 
     :resources=>"[]", 
     :application=>#<UploadIO:0x000000022af330 @content_type="application/zip"> 
     } 
    } 
    ] 
}') 
+0

Ожидаете ли вы получить доступ к zip-файлу? –

+0

no, zip-файл не переносится, поэтому я думаю, мне просто нужно преобразовать весь контент ': application' в эквивалентный строковый объект, прежде чем вызывать' eval' на нем. – nemo

+0

Но вы * хотите * он перенесен? Если вы это сделаете, вам придется читать весь zip-файл и сериализовать его вручную. Как только вы решите проблему, вы можете взглянуть на маршал или JSON или XML или какой-либо другой формат обмена данными, строгая вокруг строк Ruby, а 'eval' не может пройти через жизнь. –

ответ

2

Вы не можете разумно сделать eval на строке как есть, потому что # обрабатываются как символ комментария. Самый простой подход состоял бы в том, чтобы пойти вперед и заменить вхождения #<...> в строке с тем, что вы хотите на их месте, до выполнения eval.

+0

да, вот что я и думал. Спасибо! – nemo

Смежные вопросы