2013-08-14 3 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

아니요, zip 파일은 전송되지 않으므로': application'의 전체 내용을'eval'을 호출하기 전에 동등한 문자열 객체로 변환하면됩니다. – nemo

+0

하지만 양도 했습니까? 그렇다면 전체 zip 파일을 읽고 수동으로 직렬화해야합니다. 그런 문제를 파악한 후에는 마샬이나 JSON 또는 XML 또는 다른 데이터 교환 형식을 살펴보고 Ruby 문자열을 감싸고 'eval'은 삶을 살아갈 길이 없습니다. –

답변

2

당신은 합리적으로 그대로 문자열에 eval 할 수 없습니다. 가장 간단한 방법은 문자열에서 #<...>의 발생을 eval을 수행하기 전에 원하는 위치로 바꾸는 것입니다.

+0

그래, 그게 내가 생각한거야. 고맙습니다! – nemo

관련 문제