开发者

How do i read embedded bytarray file?

I created a tile map editor for my game and it will generate a file when the user is done with the design. The file will store the assets used and other information.

this is the code on how i generate the file

                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);

problem starts when i want to embed the generated file inside my game.

this is the code in my program.

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

    public function TileMapLoader() 
    {
    开发者_如何学C    var byteArray:ByteArray;
        byteArray = new TileMapFile();

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

whenever i run it ends in "obj = byteArray.readObject();" and will display this error.

[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.


You are using a strange class flex.messaging.io.ArrayCollection - try replacing all such imports with mx.collections.ArrayCollection.

Also make sure that all classes that are stored in file has [RemoteClass] metatag or they would be restored as Object instances.


A good read about the situation (adobe's official documentation): (Explicitly mapping ActionScript and Java objects)

I have experianced the same problem. General rules which help me to solve:

  • better to have explicitly declared metatag [RemoteClass] on your client-side actionscript classes.
  • collections of server-side classes (lists,arrays,etc.) easier to handle when represented client-side flash by mx.collections.ArrayCollection.
  • at some point you may need to explicitly declare client-side Flash class with the server-side class relationship by coding before any deserialization occures flash.net.registerClassAlias("net.acme.serverside.Foo", clientside.Foo ); otherwise your objects goes untyped as generic flash.Object after deserialization.


Check, that your ArrayCollection alias registered by this way:

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

instead of:

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

There explanation: http://livedocs.adobe.com/blazeds/1/javadoc/flex/messaging/io/ArrayCollection.html

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜