Actionscript 3 如何为自定义mxml组件使用registerClassAlias()方法

Actionscript 3 如何为自定义mxml组件使用registerClassAlias()方法,actionscript-3,apache-flex,flex4.6,Actionscript 3,Apache Flex,Flex4.6,我有flex mxml自定义组件(图形)。根据需要,需要将它们作为复制或剪切操作进行复制。但是,registerClassAlias()方法中存在问题,它如何适用于自定义图形或组(或UIComponents)组件。 var className:String = getQualifiedClassName(zorder.getItemAt(0)); _saveIn.clear(); registerClassAlias(className, zor

我有flex mxml自定义组件(图形)。根据需要,需要将它们作为复制或剪切操作进行复制。但是,registerClassAlias()方法中存在问题,它如何适用于自定义图形或组(或UIComponents)组件。

var className:String = getQualifiedClassName(zorder.getItemAt(0));
            _saveIn.clear();

            registerClassAlias(className, zorder.getItemAt(0) as Class);
            _saveIn   =     SharedObject.getLocal("save");
            _saveIn.data.value1 = new ByteArray();
            _saveIn.data.value1.writeObject(zorder.getItemAt(0));
            _saveIn.data.value1.position = 0;
            _saveIn.flush();
好的,这有一个简单的解决方案。。。您可以使用
getDefinitionByName()

因此,在您的代码中类似这样的内容:

var className:String = getQualifiedClassName(zorder.getItemAt(0));
            _saveIn.clear();

            registerClassAlias(className, getDefinitionByName(className) as Class);
            _saveIn   =     SharedObject.getLocal("save");
            _saveIn.data.value1 = new ByteArray();
            _saveIn.data.value1.writeObject(zorder.getItemAt(0));
            _saveIn.data.value1.position = 0;
            _saveIn.flush();

无法通过ByteArray以
registerClassAlias->writeObject->readObject
方式制作任何显示对象的完整副本。它仅适用于简单对象,例如数据对象(如TextFormat、value对象等)。在任何情况下,您都必须为每种类型的对象测试复制方法,以确保其正常工作

压顶
形状的示例,最简单的显示对象:

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
coping是一个老话题,你可以通过上面提到的错误(特别是最后一个错误)在谷歌上搜索很多关于这个的帖子,但答案是:你不能通过ByteArray复制显示对象,你需要编写自定义方法来创建给定文本字段的副本,Sprite或VBox并手动复制所有属性。

MXML组件是与Actionscript类类似的类。那不是也一样吗?你试过了吗?也许你可以展示一些代码来进一步解释你想做什么。@SunilD。只要检查一下这个代码…表面上看起来还可以。你能描述一下当你试图编码/解码对象时会发生什么吗?调用write对象后字节数组的长度是多少?当您尝试解码共享对象时,该对象中有什么内容,空字节数组为null,等等?当我调用此代码时,在registerClassAlias()方法中给出execption。TypeError:Error#2007:Parameter classObject必须为非null。好的,问题是您正在尝试强制转换DisplayObject(由
zorder.getItemAt(0)返回的内容)
到一个类…当该转换失败时,
as
操作符返回
null
。目前,获取对象类名的正确方法是逃避我…我将查找并响应,或者这里的一个天才将解释:)这会导致编译器错误。此行有多个标记:-1118:将具有静态类型对象的值隐式强制到可能不相关的类型类-1更改行,1添加sorry,getDefinitionByName()返回一个对象,您必须将其强制转换为一个类(如我链接到的博客文章)。但是,唉,fsbmain说这无论如何对DiaplayObject不起作用。