所以,我一直在使用ByteArrays最近很多,我遇到了一些令人討厭的問題,讓我想撕開我的頭髮。AS3 - 問題與IExternalizable
基本上,我試圖保存一個應用程序的項目數據,我正在爲一個遊戲編譯一個文件的字符。該項目由自定義對象,矢量,矢量矢量以及自定義對象矢量矢量組成。我認爲正確編寫所有這些數據的最好方法是使用帶有readExternal和writeExternal命令的IExternalizable接口。所以這就是我在做什麼。
我所有的項目數據寫入到一個對象,然後寫一個對象到ByteArray,並將其保存到一個文件:
// probject means project object !
mProbject= { };
// Register vector as class, just to prevent any errors about that just in case
registerClassAlias("vec_core.timeline.KeyFrame", Vector.<KeyFrame> as Class);
// single KeyFrame Object
mProbject.currentFrame = Main.getInstance().animationList.selectedItem.currentKeyFrame;
// a Vector.<Vector.<KeyFrame>>
mProbject.frames = Main.getInstance().animationList.keyFrameVectorVector;
// an unsigned int
mProbject.selectedItemIndex = Main.getInstance().animationList.entries.indexOf(Main.getInstance().animationList.selectedItem);
// Vector.<String>
mProbject.animationNames = Main.getInstance().animationList.animationNames;
// String
mProbject.projectPath = nativePath;
//String
mProbject.projectName = name;
mByteArray = new ByteArray();
mByteArray.writeObject(mProbject);
mByteArray.compress();
return mByteArray;
關鍵幀類,但是裏面,有自定義對象的兩個向量:
private var mHitboxes:Vector.<Hitbox>;
private var mHitboxSprites:Vector.<HitboxSprite>;
,所以我成立這兩個類和我的Keyframe類的使用IExternalizable的:
public class HitboxSprite extends Sprite implements IExternalizable
{
public function readExternal(input:IDataInput):void
{
trueBounds.x = input.readFloat();
trueBounds.y = input.readFloat();
trueBounds.width = input.readFloat();
trueBounds.height = input.readFloat();
mHitbox = input.readObject();
}
public function writeExternal(output:IDataOutput):void
{
output.writeFloat(trueBounds.x);
output.writeFloat(trueBounds.y);
output.writeFloat(trueBounds.width);
output.writeFloat(trueBounds.height);
output.writeObject(mHitbox);
}
}
public class Hitbox implements IExternalizable
{
public function readExternal(input:IDataInput):void
{
mName = input.readUTF();
mType = input.readUnsignedInt();
mEnabled = input.readBoolean();
mKnockback = input.readBoolean();
x = input.readFloat();
y = input.readFloat();
width = input.readFloat();
height = input.readFloat();
addMultipleTags(input.readUTF());
}
public function writeExternal(output:IDataOutput):void
{
output.writeUTF(mName);
output.writeUnsignedInt(mType);
output.writeBoolean(mEnabled);
output.writeBoolean(mKnockback);
output.writeFloat(mX);
output.writeFloat(mY);
output.writeFloat(mWidth);
output.writeFloat(mHeight);
output.writeUTF(getAllTags());
}
}
public class KeyFrame implements IExternalizable
{
public function readExternal(input:IDataInput):void
{
mID = input.readUnsignedInt();
mLabel = input.readUTF();
}
public function writeExternal(output:IDataOutput):void
{
output.writeUnsignedInt(mID);
output.writeUTF(mLabel);
}
}
但是當它到達的「根」的writeObject()方法的ByteArray,我得到的錯誤:
[Fault] exception, information=ArgumentError: Error #2004: One of the parameters is invalid.
這可能是最惱人的問題我曾經有過。似乎我已經嘗試了一切,沒有任何工作。 是否有其他人有這方面的經驗?難道我做錯了什麼?? 我會很感激任何幫助,我可以得到這一點。我只想繼續製作我的遊戲:<
也許您在尋找[this](http://stackoverflow.com/questions/14576627/how-to-work-registerclassalias-method-for-custom-mxml-components)? –
@MarcoAurélioDeleu我的朋友,你救了我的命。我幾乎失去了理智,所以,我感謝你。那個問題在我搜索這個問題時沒有出現,所以我很感謝你指點我那個答案! adobe文檔只是告訴您註冊該類,但不是隻有註冊該對象時它才能用於自定義對象!如果你願意,你可以讓你的評論一個答案,我會很樂意接受它:> – SnaiLegacy