Flash 保存类的字节码(到SharedObject或数据库)

Flash 保存类的字节码(到SharedObject或数据库),flash,apache-flex,actionscript-3,actionscript,Flash,Apache Flex,Actionscript 3,Actionscript,注意:我想保存AS3类的实际字节码,而不是它的实例 正在从外部加载一个类,并通过urloader和Loader.loadBytes提取该类。然后从该应用程序域中提取一个类并在项目中使用 现在,与其保存整个加载程序(通过SharedObject或其他存储方式),还可以“提取”所需类的字节码和所有依赖项,然后这些字节码可以“注入”回空壳或需要时重用的东西中吗?您可以尝试使用ByteArray.writeObject,它将保存对象属性的可反转快照。您可以尝试使用ByteArray.writeObjec

注意:我想保存AS3类的实际字节码,而不是它的实例

正在从外部加载一个类,并通过
urloader
Loader.loadBytes
提取该类。然后从该应用程序域中提取一个类并在项目中使用


现在,与其保存整个加载程序(通过
SharedObject
或其他存储方式),还可以“提取”所需类的字节码和所有依赖项,然后这些字节码可以“注入”回空壳或需要时重用的东西中吗?

您可以尝试使用ByteArray.writeObject,它将保存对象属性的可反转快照。

您可以尝试使用ByteArray.writeObject,它将保存对象属性的可反转快照。

是否要评估(一些代码)?AS3中没有eval(),但这可能会帮助您:

您也可以像3Devil建议的那样用AMF保存类

例如:

package vos
{
    import flash.utils.ByteArray;
    import org.flixel.FlxPath;

    public class ActionVO extends Object
    {
        public var pid:uint;
        public var cid:uint;
        public var action:String;
        public var data:*;

    }
}
以及要保存的共享对象所需的类

registerClassAlias( "org.flixel::FlxPath", FlxPath );
registerClassAlias( "org.flixel::FlxPoint", FlxPoint );
registerClassAlias( "VO::ActionVO", ActionVO );
储蓄:

var byteArray:ByteArray = new ByteArray();
byteArray.writeObject(data);
shared.data.byteArray = byteArray;
..和装载:

var ba:ByteArray = shared.data.byteArray
ba.uncompress();
var vo:ActionVO = ba.readObject() as ActionVO; 
这里有vo(简单值对象类,包括更复杂的类FlxPath)

那么您想评估(一些代码)吗?AS3中没有eval(),但这可能会帮助您:

您也可以像3Devil建议的那样用AMF保存类

例如:

package vos
{
    import flash.utils.ByteArray;
    import org.flixel.FlxPath;

    public class ActionVO extends Object
    {
        public var pid:uint;
        public var cid:uint;
        public var action:String;
        public var data:*;

    }
}
以及要保存的共享对象所需的类

registerClassAlias( "org.flixel::FlxPath", FlxPath );
registerClassAlias( "org.flixel::FlxPoint", FlxPoint );
registerClassAlias( "VO::ActionVO", ActionVO );
储蓄:

var byteArray:ByteArray = new ByteArray();
byteArray.writeObject(data);
shared.data.byteArray = byteArray;
..和装载:

var ba:ByteArray = shared.data.byteArray
ba.uncompress();
var vo:ActionVO = ba.readObject() as ActionVO; 

还有vo(简单值对象类,包括更复杂的类FlxPath)

对我来说,这似乎是一个奇怪的请求。您的用例是什么?您是否正在尝试进行缓存?Flash player为您处理现金,所以您不必@Flextras我偶然发现了一个项目,该项目允许您编写逻辑来控制当前几乎通过上述过程在运行时加载的逻辑(它实际上使用
FileReference
而不是
urloader
)。我希望“存储”不同的逻辑,以避免每次运行程序时都必须重新加载它,并存储相同逻辑的不同“版本”。不过,我可以肯定地看到这个系统在其他地方也有用途。为什么要下课呢?如果您需要插件系统,请使用类加载swf。有很多方法可以从swf中获取类列表,然后您可以实例化它们。对我来说,这似乎是一个奇怪的请求。您的用例是什么?您是否正在尝试进行缓存?Flash player为您处理现金,所以您不必@Flextras我偶然发现了一个项目,该项目允许您编写逻辑来控制当前几乎通过上述过程在运行时加载的逻辑(它实际上使用
FileReference
而不是
urloader
)。我希望“存储”不同的逻辑,以避免每次运行程序时都必须重新加载它,并存储相同逻辑的不同“版本”。不过,我可以肯定地看到这个系统在其他地方也有用途。为什么要下课呢?如果您需要插件系统,请使用类加载swf。有几种方法可以从swf中获取类列表,然后您可以实例化它们。这将保存实例属性,而不是实际的类逻辑。此外,您仍然需要该类存在于当前应用程序域中,以便将实例恢复到其状态。;)你所说的一般都是模块。我用它来实例化不同的对象,共享同一个接口。我加载模块,它基本上只是所需子类的一个实例,然后将其传递给主应用程序,然后释放模块。您不需要包含类,只需要包含使该类可用的接口。这将保存实例属性,而不是实际的类逻辑。此外,您仍然需要该类存在于当前应用程序域中,以便将实例恢复到其状态。;)你所说的一般都是模块。我用它来实例化不同的对象,共享同一个接口。我加载模块,它基本上只是所需子类的一个实例,然后将其传递给主应用程序,然后释放模块。您不需要包含类,只需要包含使该类可用的接口。如前所述,这将保存对象的所有“值”,但不会存储字节码或函数指令。不,这不是真的。我的示例可能非常糟糕:)重要的部分是registerClassAlias(“org.flixel::FlxPath”,FlxPath);这使得在类中使用值和函数成为可能…好吧,你有了新的注释:“注意:我想为AS3类保存实际的字节码”。你是对的,你不能加载新类并将其用作新类。Eval很接近,但不一样,而且AS3.hmm中没有Eval(),你评论中的“虚拟机器人”有点有趣!我的多动症眼睛从那里看不到任何东西;没有下载,没有来源。。我快速浏览了一下博客,但其他内容太多了:)你能告诉我更多吗?他们博客上所有标记为“机器人战争”的帖子都有更多细节。我只玩过一次,但如果您还想了解更多详细信息,请告诉我。如前所述,这将保存对象的所有“值”,但不会存储字节码或函数指令。不,这不是真的。我的示例可能非常糟糕:)重要的部分是registerClassAlias(“org.flixel::FlxPath”,FlxPath);这使得在类中使用值和函数成为可能…好吧,你有了新的注释:“注意:我想为AS3类保存实际的字节码”。你是对的,你不能加载新类并将其用作新类。Eval很接近,但不一样,而且AS3.hmm中没有Eval(),你评论中的“虚拟机器人”有点有趣!我的多动症眼睛看不见