Actionscript 3 Flex 4.5 Проблема сериализации / десериализации? - PullRequest
0 голосов
/ 08 сентября 2011

У меня возникла конкретная проблема десериализации объекта в проекте Flex 4.5 Mobile.Я подключился к штрафу Webservice и заполнил штраф ListBox.Я могу выбрать элемент и получить детализацию также хорошо, но после сериализации объекта и попытки десериализации его;определение объекта где-то теряется.

У меня есть переменная, когда пользователь выбирает запрос в списке

private var selectedReq:ServiceRequest;
//Here we instantiate the local variable when user select id in ListBox
selectedReq = event.currentTarget.selectedItem as ServiceRequest;           

Каждый запрос на обслуживание, выбранный пользователем для сохранения, вызывает этот метод.

            private function writeServiceRequest():void {
            var filename:String = buildFileName();

            var file:File = File.applicationStorageDirectory.resolvePath(filename);
            if (file.exists)
                file.deleteFile();
            var fileStream:FileStream = new FileStream();
            fileStream.open(file, FileMode.WRITE);

//selectedReq is the private var of the users selected item
            fileStream.writeObject(selectedReq); 
            fileStream.close();
        }

Когда пользователи хотят просмотреть запрос, вызывается этот метод.

        private function readServiceRequest():ServiceRequest {
            var filename:String = buildFileName();
            var file:File = File.applicationStorageDirectory.resolvePath(filename);
            if (!file.exists) {
                return null;
            }

            var fileStream:FileStream = new FileStream();
            fileStream.open(file, FileMode.READ);
            var objReq:ServiceRequest = fileStream.readObject() as ServiceRequest;

            fileStream.close();

            return objReq;
        }

Объект класса похож на.

public var id:uint;
public var requisitioner:String;
public var requestItems:ArrayCollection //Webservice it's actually List<requestItems>
public var requestProcesses:ArrayCollection // WSDL it's actually List<>

Когда я пытаюсьчитать / десериализовать как

                 //This line is null but the file exist and the object was written
            var objReq:ServiceRequest = readServiceRequest() as ServiceRequest;

            if(objReq) {
                selectedReq = objReq;
            }

Если я не приведу readServiceRequest () как ServiceRequest и просто верну Object;Я могу перебирать Object и получать правильные значения, возвращаемые из сериализованного объекта.

Я могу только предположить, что это может быть вызвано классами, созданными Flex с помощью веб-службы?Если записываются значения, а не тип объекта, то что-то должно быть потеряно в сериализации - правильно?

Извините за все детали, но я немного растерялся в это время ..... любая помощь будет оценена.

RL

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

var objReq:ServiceRequest = readServiceRequest() as ServiceRequest;

Приведенная выше строка будет возвращать ноль.

Бьюсь об заклад, если вы измените его следующим образом:

var objReq:ServiceRequest = ServiceRequest(readServiceRequest());

Вы получите исключение во время выполнения с сообщением, похожим на Невозможно привести ObjectProxy к ServiceRequest

Если это так, то причина, по которой вы получаете это, заключается в том, что сериализатор AMF не сохраняет информацию о типе при сериализации ServiceRequest экземпляра.

Чтобы это исправить, вам нужно вызвать flash.net.registerClassAlias ​​() перед сериализацией / десериализацией.

flash.net.registerClassAlias("fully.qualified.name.ServiceRequest", ServiceRequest);

1 голос
/ 03 ноября 2011

Попробуйте, если это сработает.

  1. Проверьте, является ли event.result ByteArray.

  2. Чтение / сохранение события.result как ByteArray. var byteArray:ByteArray = event.result as ByteArray;

  3. Получить / десериализовать объект с помощью функции readObject (). var object:Object = byteArray.readObject();

  4. Приведение к типу целевого объекта. ServiceRequest в вашем случае. var tartgettedObject:ServiceRequest = object as ServiceRequest; или же var tartgettedObject:ServiceRequest = ServiceRequest(object);

0 голосов
/ 11 сентября 2011

Я плохо за то, что не выполнил вход перед публикацией вопроса.

Я использовал registerClassAlias, который не помог.Я обнаружил на форуме Adobe и другие проблемы, связанные с симуляцией, и постоянная обратная связь заключалась в том, что проблема, скорее всего, вызвана потерей класса объекта его атрибутов во время записи файла, поскольку объекты класса записываются при создании источника данных из веб-службы.Начиная с моего первоначального вопроса, мы решили использовать SQLite, который работает отлично - спасибо за вашу помощь.

RL

...