2011-03-01 88 views
3

我在Flex中使用ExternalInterface的檢索從Javascript AMF編碼字符串彎曲。問題是AMF編碼的字符串有時包含\ u0000,導致ExternalInterface返回null而不是Javascript中的編碼字符串。問題從Javascript傳遞數據

任何想法如何解決這個問題?

在此先感謝。

+0

你通過的Flash Remoting或通過類似AMFPHP使用AMF?我只使用AMF作爲服務(從來不必使用ExternalInterface)。 - http://amfphp.sourceforge.net/ AMF庫您使用JavaScript的是什麼 – Jacksonkr 2011-03-01 21:57:01

+0

。你有沒有分享一些代碼來重現問題? – JeffryHouser 2011-03-01 22:35:35

回答

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字符。

在Flash端,直接接收數據之後使用

receiveString = receiveString.replace (/\{nil\}/g, "\u0000"); 

+0

智力+1。假設奇怪的字符不是AMF數據包的重要部分,這應該工作。 – JeffryHouser 2011-03-01 23:05:23

+0

是\ u0000是AMF消息的一部分。我曾嘗試用另一個字符替換它,並在Flex中返回到\ u0000,但沒有運氣。我正在使用Google App Engine將AMF消息推送至Javascript,然後再推送至Flex。該消息在GAE站點上使用pyamf編碼爲AMF3,在Javascript中看起來正確,但在通過ExternalInterface傳遞給Flex時失敗。在傳入DateTimeProperty或IntegerProperty時,PyAMF編碼使用\ u0000。 StringProperty不是用\ u0000編碼的,所以一種解決方案是將所有的類屬性改爲字符串,但我不喜歡這樣做。 – doorman 2011-03-02 00:46:07

+0

我根據這個新信息編輯了答案。 – weltraumpirat 2011-03-02 05:54:20