Как прочитать встроенный файл bytarray? - PullRequest
0 голосов
/ 09 сентября 2011

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

. Это код того, как я генерирую файл. Проблема 1003 *

                var ba:ByteArray = new ByteArray();
                var masterData:Object = { map:Data.instance.mapLayerArr, 
                                               asset:assetCollection, 
                                               gridrow:Data.instance.gridRow,
                                               gridColumn: Data.instance.gridColumn,
                                               cellWidth: Data.instance.cellWidth,
                                               cellHeight: Data.instance.cellHeight,
                                               assetCount: Data.instance.assetCount,
                                               layerCount: Data.instance.layerCount,
                                               version: Data.instance.version};

                ba.writeObject(masterData);
                ba.compress();
                file = new FileReference();
                file.save(ba, Data.instance.fileName);

начинается, когда я хочу встроить сгенерированный файл в свою игру.

это код в моей программе.

    [Embed(source='../../../../res/tilemapdata/File Name', mimeType='application/octet-stream')]
    public static const TileMapFile:Class;

    public function TileMapLoader() 
    {
        var byteArray:ByteArray;
        byteArray = new TileMapFile();

        byteArray.uncompress();
        var obj:Object;
        obj = byteArray.readObject();
        trace(fileReference);
    }

всякий раз, когда я запускаю его, заканчивается «obj = byteArray.readObject ();»и отобразит эту ошибку.

[Fault] exception, information=ArgumentError: Error #2173: Unable to read object in stream.  The class flex.messaging.io.ArrayCollection does not implement flash.utils.IExternalizable but is aliased to an externalizable class.

Ответы [ 3 ]

0 голосов
/ 31 января 2012

Хорошее прочтение о ситуации (официальная документация Adobe): ( Явное сопоставление объектов ActionScript и Java )

Я столкнулся с той же проблемой.Общие правила, которые помогают мне решить:

  • лучше иметь явно объявленный метатег [RemoteClass] в ваших клиентских скриптах классов.
  • коллекции серверных классов (списки, массивыи т. д.) легче обрабатывать, когда он представлен на стороне клиента флэш-памятью с помощью mx.collections.ArrayCollection.
  • В какой-то момент вам может потребоваться явно объявить класс Flash на стороне клиента с отношением класса на стороне сервера путем кодирования передлюбая десериализация происходит flash.net.registerClassAlias("net.acme.serverside.Foo", clientside.Foo );, в противном случае ваши объекты становятся нетипизированными как flash.Object после десериализации.
0 голосов
/ 23 апреля 2012

Убедитесь, что ваш псевдоним ArrayCollection зарегистрирован следующим образом:

import mx.collections.ArrayCollection;
...
registerClassAlias("flex.messaging.io.ArrayCollection", ArrayCollection);

вместо:

import mx.collections.ArrayCollection;
...
registerClassAlias("mx.collections.ArrayCollection", ArrayCollection);

Там объяснение: http://livedocs.adobe.com/blazeds/1/javadoc/flex/messaging/io/ArrayCollection.html

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

Вы используете странный класс flex.messaging.io.ArrayCollection - попробуйте заменить все такие импорта на mx.collections.ArrayCollection.

Также убедитесь, что все классы, которые хранятся в файле, имеют метатег [RemoteClass], иначе они будут восстановлены.как Object экземпляров.

...