0

我为我的游戏创建了一个平铺地图编辑器,它会在用户完成设计后生成一个文件。该文件将存储使用的资产和其他信息。

这是我如何生成文件的代码

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

3 回答 3

0

您正在使用一个奇怪的类flex.messaging.io.ArrayCollection- 尝试将所有此类导入替换为mx.collections.ArrayCollection.

还要确保存储在文件中的所有类都具有[RemoteClass]元标记,否则它们将被恢复为Object实例。

于 2011-09-09T10:41:23.097 回答
0

检查您的 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

于 2012-04-22T23:40:31.100 回答
0

很好地阅读了这种情况(adobe 的官方文档):(显式映射 ActionScript 和 Java 对象

我遇到过同样的问题。帮助我解决的一般规则:

  • 最好在客户端动作脚本类上明确声明元标记 [RemoteClass]。
  • 当由 mx.collections.ArrayCollection 表示客户端闪存时,服务器端类(列表、数组等)的集合更易于处理。
  • 在某些时候,您可能需要在任何反序列化发生之前通过编码显式声明客户端 Flash 类与服务器端类关系,flash.net.registerClassAlias("net.acme.serverside.Foo", clientside.Foo );否则您的对象在反序列化后将无类型化为泛型flash.Object
于 2012-01-30T21:07:15.437 回答