Actionscript 3 as3对象序列化(到as3代码)

Actionscript 3 as3对象序列化(到as3代码),actionscript-3,reflection,inspection,Actionscript 3,Reflection,Inspection,我要做的是遍历一个对象,它也是一个复杂的对象树,并输出创建、实例化和填充该对象及其所有子对象所需的actionscript 3代码 例如,如果您在调试器中看到类似的内容 myObjectToParse (ParseMe@173e239) ----------[0]someBlob (SomeBlob@173e322)|null ----------[1]someChildren (Array@173e239) --------------------[0]childFoo (ChildFoo@1

我要做的是遍历一个对象,它也是一个复杂的对象树,并输出创建、实例化和填充该对象及其所有子对象所需的actionscript 3代码

例如,如果您在调试器中看到类似的内容

myObjectToParse (ParseMe@173e239)
----------[0]someBlob (SomeBlob@173e322)|null
----------[1]someChildren (Array@173e239)
--------------------[0]childFoo (ChildFoo@123e239)
------------------------------someProperty (Number@173e239) | 45
------------------------------someOtherProperty (Number@173e239) | 45
--------------------[1]childBar (ChildFoo@123e239)
------------------------------someStringProperty(String@173e239) | "hello world"
出口商会吐出:

public class MySerialized extends ParseMe
{
    public var someBlob:SomeBlob;
    public var someChildren:Array;

    public function MySerialized()
    {
        //populateSomeBlob(); //its null so the export doesn't write it out    
        populateSomeChildren();    
    }

    private function populateSomeChildren()
    {
        someChildren=new Array(2);
        var childFoo:ChildFoo=new ChildFoo();
        childFoo.someProperty=45;
        childFoo.someOtherProperty=45;
        childFoo.someProperty=45;
        childFoo.someOtherProperty=45;

        var childBar=new ChildBar();
        childBar.someStringProperty="hello world";

        someChildren[0]=childFoo;
        someChildren[1]=childBar;
    }
}
有什么建议吗?思想?谢谢


编辑:我想我可能最终只是尝试序列化到amf ByteArray…听起来更简单,但我还没有玩过,也不知道它可以深入多少层以及它支持什么类型的引用。

可能会有帮助;)

可能有帮助;)

总的来说,恐怕这是不可能的。。。例如,您有只读属性。。。另外,一些类的构造函数需要初始化值(虽然我个人认为在大多数情况下这不是很聪明,但还行)。。。此外,某些对象可能是私有/内部类的实例,因此生成的实例化代码将抛出错误

但是,您可以为没有这些问题的对象制定解决方案

好的,基本上,
flash.utils.descripbetype
会有很多帮助。。。这将为您提供一个对象的所有字段(还告诉您,它是否有只读字段等),以及类名

这将帮助您遍历对象属性。。。对于动态对象(describeType将告诉您),您还必须使用for in循环来循环属性。。。使用
*
作为迭代变量的类型,这样它也可以与
字典一起使用,例如

然后您需要特别处理特定的内置类型

  • XML
    :使用
    XML::toXMLString
    。。。这将为
    XML
    literal提供基础
  • 数组
    :循环遍历它,并构建一个数组文本
  • Number
    int
    uint
    Boolean
    :对文本使用标准字符串表示法
  • String
    :记住转义字符串(换行符、反斜杠等)。。。最简单的方法是
    “unescape('”+escape(yourStringValue)+“);”
    。。。当然,您可以使用转义序列创建一个普通的
    字符串
    文本。。。最简单的方法是
    com.adobe.serialization.JSON.serialize(yourStringValue)
    (使用as3corelib)
  • Date
    :使用类似于
    “新日期(“+yourDateValue.getTime()+”);”
    。。。虽然这是值得怀疑的,但它是否真的有意义的harcode日期
  • DisplayObject
    和子类:如果您真的想要,这将不是一件小事。。。您需要找到正确重建显示列表层次结构的方法
  • IEventDispatcher
    和实现者:这是不可能的。。。无法找到注册到
    IEventDispatcher
    的处理程序,而且您将很难从函数对象生成ActionScript(非常不可能)。。。 您必须选择递归方法。。。请注意,如果您想支持循环引用,这将更加困难。。。在设计算法之前,你可能想做出决定
希望这有助于

格里茨


一般来说,这是不可能的,恐怕。。。例如,您有只读属性。。。另外,一些类的构造函数需要初始化值(虽然我个人认为在大多数情况下这不是很聪明,但还行)。。。此外,某些对象可能是私有/内部类的实例,因此生成的实例化代码将抛出错误

但是,您可以为没有这些问题的对象制定解决方案

好的,基本上,
flash.utils.descripbetype
会有很多帮助。。。这将为您提供一个对象的所有字段(还告诉您,它是否有只读字段等),以及类名

这将帮助您遍历对象属性。。。对于动态对象(describeType将告诉您),您还必须使用for in循环来循环属性。。。使用
*
作为迭代变量的类型,这样它也可以与
字典一起使用,例如

然后您需要特别处理特定的内置类型

  • XML
    :使用
    XML::toXMLString
    。。。这将为
    XML
    literal提供基础
  • 数组
    :循环遍历它,并构建一个数组文本
  • Number
    int
    uint
    Boolean
    :对文本使用标准字符串表示法
  • String
    :记住转义字符串(换行符、反斜杠等)。。。最简单的方法是
    “unescape('”+escape(yourStringValue)+“);”
    。。。当然,您可以使用转义序列创建一个普通的
    字符串
    文本。。。最简单的方法是
    com.adobe.serialization.JSON.serialize(yourStringValue)
    (使用as3corelib)
  • Date
    :使用类似于
    “新日期(“+yourDateValue.getTime()+”);”
    。。。虽然这是值得怀疑的,但它是否真的有意义的harcode日期
  • DisplayObject
    和子类:如果您真的想要,这将不是一件小事。。。您需要找到正确重建显示列表层次结构的方法
  • IEventDispatcher
    和实现者:这是不可能的。。。无法找到注册到
    IEventDispatcher
    的处理程序,而且您将很难从函数对象生成ActionScript(非常不可能)。。。 您必须选择递归方法。。。请注意,如果您想支持循环引用,这将更加困难。。。在设计算法之前,你可能想做出决定
希望这有帮助