registerClassAlias->writeObject->readObject
アプローチを使用して ByteArray を介して表示オブジェクトの完全なコピーを作成することはできません。データオブジェクト(TextFormat、値オブジェクトなど)などの単純なオブジェクトでのみ機能します。どのような場合でも、オブジェクトのタイプごとに copy メソッドをテストして、正しく動作することを確認する必要があります。
Shape
最も単純な表示オブジェクトである対処の例:
package
{
import avmplus.getQualifiedClassName;
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.Shape;
import flash.net.registerClassAlias;
import flash.utils.ByteArray;
import flash.utils.getDefinitionByName;
public class astest extends MovieClip
{
public function astest()
{
init();
}
private function init():void
{
var sh:Shape = new Shape();
sh.graphics.beginFill(0xFF0000);
sh.graphics.drawEllipse(100, 100, 100, 70);
sh.graphics.endFill();
addChild(sh);
registerObject(sh);
var ba:ByteArray = new ByteArray();
ba.writeObject(sh);
ba.position = 0;
var obj:Object = ba.readObject();
var shCopy:DisplayObject = obj as DisplayObject;
if(shCopy)
{
shCopy.x = shCopy.y = 100;
addChild(shCopy);
}
}
private function registerObject(obj:Object):void
{
try
{
var qname:String = getQualifiedClassName(obj);
var cname:String = qname.split("::").join(".");
var classs:Class = getDefinitionByName(cname) as Class;
registerClassAlias(qname, classs);
}catch(error:Error)
{
trace(error.message);
}
}
}
}
出力:
TypeError: Error #1034: Type Coercion failed: cannot convert Object@eae09b9 to flash.geom.Transform.
flash.geom.Transform
したがって、対処する前に登録を試みることができます。
registerObject(sh.transform);
しかし、これは別のエラーにつながります:
ArgumentError: Error #1063: Argument count mismatch on flash.geom::Transform(). Expected 1, got 0
実際、DisplayObject
対処は古いトピックであり、上記のエラー (特に最後のエラー) でこれに関する多くの投稿をグーグルで検索できますが、答えは次のとおりです。ByteArray 経由で表示オブジェクトをコピーすることはできません。カスタムを記述する必要があります。指定された TextField、Sprite、または VBox のコピーを作成し、すべてのプロパティを手動でコピーするメソッド。