我为自己的游戏创建了一个贴图编辑器,它将在用户完成设计后生成一个文件。该文件将存储使用的资产和其他信息。
这是我如何生成文件
的代码 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.
您正在使用一个奇怪的类flex.messaging.io.ArrayCollection
-尝试用mx.collections.ArrayCollection
替换所有这些导入
还要确保所有的类都存储在文件中有[RemoteClass]
元标记,否则它们将被恢复为Object
实例。
关于情况的良好阅读(adobe的官方文档):(显式映射ActionScript和Java对象)
我也遇到过同样的问题。帮助我解决的一般规则:
- 最好在客户端actionscript类中明确声明元标签[RemoteClass]。
- 服务器端类(列表,数组等)的集合,当用mx.collections.ArrayCollection表示客户端flash时更容易处理。
- 在某些时候,您可能需要在任何反序列化发生之前通过编码显式地声明客户端Flash类与服务器端类关系
flash.net.registerClassAlias("net.acme.serverside.Foo", clientside.Foo );
,否则您的对象将在反序列化后成为无类型的通用flash.Object
。
检查您的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