Проблема с передачей данных из Javascript во Flex

Я использую ExternalInterface во Flex для извлечения закодированной строки AMF из Javascript. Проблема заключается в том, что закодированная строка AMF иногда содержит , из-за чего ExternalInterface возвращает значение null вместо закодированной строки из Javascript.

Есть идеи, как это решить?

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


person doorman    schedule 01.03.2011    source источник
comment
вы используете AMF через Flash Remoting или через что-то вроде AMFPHP? Я только когда-либо использовал AMF в качестве службы (никогда не приходилось использовать ExternalInterface). -- amfphp.sourceforge.net   -  person Jacksonkr    schedule 02.03.2011
comment
Какую библиотеку AMF вы используете для JavaScript. Можете ли вы поделиться кодом, чтобы воспроизвести проблему?   -  person JeffryHouser    schedule 02.03.2011


Ответы (2)


\0000 ошибочно интерпретируется как EOF при чтении внешних данных. То же самое происходит, когда он появляется в файлах XML.

Вы должны иметь возможность заменить его однозначной последовательностью символов перед передачей строки во Flash и обратно после ее приема в ActionScript. В функции JavaScript используйте что-то вроде

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

Это должно удалить нежелательные символы \0000 из строки, прежде чем возвращать ее во Flash.

На стороне Flash используйте

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

непосредственно после получения данных.

person weltraumpirat    schedule 01.03.2011
comment
+1 за изобретательность. Это должно работать, если предположить, что странный символ не является важной частью пакета AMF. - person JeffryHouser; 02.03.2011
comment
Да, является частью сообщения AMF. Я попытался заменить его другим символом и вернуться к \ u0000 во Flex, но безуспешно. Я использую Google App Engine для отправки сообщения AMF в Javascript, а затем во Flex. Сообщение кодируется в AMF3 с помощью pyamf на сайте GAE и выглядит правильно в Javascript, но не удается передать его во Flex через ExternalInterface. Кодировка PyAMF использует при передаче DateTimeProperty или IntegerProperty. StringProperty не кодируется , поэтому одним из решений было бы изменить все свойства класса на строку, но я не люблю этого делать. - person doorman; 02.03.2011

Кодирование вывода pyamf AMF в base64 сделает свое дело.

Вот часть кодирования в python:

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();
person doorman    schedule 02.03.2011