2011-03-01 5 views
3

Flex에서 ExternalInterface를 사용하여 Javascript에서 AMF로 인코딩 된 문자열을 가져옵니다. 문제는 AMF로 인코딩 된 문자열에 때때로 \ u0000이 포함되어 있기 때문에 ExternalInterface가 Javascript에서 인코딩 된 문자열 대신 null을 반환하도록합니다.Javascript에서 Flex로 데이터를 전달할 때 문제가 발생했습니다.

어떻게 해결할 수 있을까요?

미리 감사드립니다.

+0

당신이 플래시 리모팅을 통해 또는 AMFPHP 같은 것을 통해 AMF를 사용하고 있습니까? 필자는 AMF만을 서비스로 사용했습니다 (ExternalInterface를 사용하지 않아도 됨). - http://amfphp.sourceforge.net/ – Jacksonkr

+0

JavaScript 용 AMF 라이브러리는 무엇입니까? 문제를 재현하기 위해 몇 가지 코드를 공유하십니까? – JeffryHouser

답변

2

pyamf AMF 출력을 base64로 인코딩하면 트릭을 수행하게됩니다. 여기

encoder = pyamf.get_encoder(pyamf.AMF3) 
encoder.writeObject(myObject) 
encoded = base64.b64encode(encoder.stream.getvalue()) 

AS3에서 디코딩 부분은 다음과 같습니다 :

여기 파이썬에서 인코딩 부분은

var myDecoder:Base64Decoder = new Base64Decoder(); 
myDecoder.decode(base64EncodedString); 
var byteArr:ByteArray = myDecoder.toByteArray() 
byteArr.position = 0; 
var input:Amf3Input = new Amf3Input(); 
input.load(byteArr);     
var test:MyObject = input.readObject(); 
4

\ 0000은 외부 데이터를 읽을 때 EOF로 잘못 해석됩니다. XML 파일에도 같은 일이 발생합니다.

문자열을 Flash로 전달하기 전에 명확한 문자 시퀀스로 바꿀 수 있어야하고 ActionScript로 수신 할 때 되돌릴 수 있어야합니다. JavaScript 함수에서 다음과 같이 사용하십시오.

return returnString.replace (/\0000/g, "{nil}"); 

이렇게하면 Flash에 반환하기 전에 원치 않는 \ 0000자를 문자열에서 제거해야합니다. 플래시 측면

직접 데이터를 수신 한 후
receiveString = receiveString.replace (/\{nil\}/g, "\u0000"); 

를 사용한다.

+0

+1 독창성. 이상한 문자가 AMF 패킷의 중요한 부분이 아니라고 가정하면 작동합니다. – JeffryHouser

+0

예, \ u0000은 AMF 메시지의 일부입니다. 나는 플렉스에서 운율없이 \ u0000으로 다른 캐릭터로 교체하려고 시도했다. Google App Engine을 사용하여 AMF 메시지를 Javascript로 푸시 한 다음 Flex로 푸시합니다. 메시지는 GAE 사이트의 pyamf를 사용하여 AMF3으로 인코딩되며 Javascript에서는 올바르게 보이지만 ExternalInterface를 통해 Flex로 전달할 때 실패합니다. PyAMF 인코딩은 DateTimeProperty 또는 IntegerProperty를 전달할 때 \ u0000을 사용합니다. StringProperty는 \ u0000으로 인코딩되지 않으므로 한 가지 해결책은 모든 클래스 속성을 string으로 변경하는 것이지만 그렇게하지 않으려 고합니다. – doorman

+0

이 새로운 정보에 따라 답변을 편집했습니다. – weltraumpirat