【问题标题】:as3 object serialization (to as3 code)as3 对象序列化(到 as3 代码)
【发布时间】:2009-07-27 18:05:35
【问题描述】:

我正在尝试做的是遍历一个对象,该对象也是一个复杂的对象树,并输出创建实例化和填充该对象及其所有子对象所采用(或采用)的 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...听起来更简单,但我没有玩过,也不知道它可以深入多少层以及它的引用类型支持。

【问题讨论】:

    标签: actionscript-3 reflection inspection


    【解决方案1】:

    一般来说,这是不可能的,恐怕......例如,你有只读属性......而且,一些类的构造函数需要初始化值(虽然我个人认为这在大多数情况下不是很聪明,但是没关系)......另外,一些对象可能是私有/内部类的实例,所以生成的实例化代码会抛出错误......

    但是,您可以为不存在这些问题的对象制定解决方案...

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

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

    那么你需要特别对待特定的内置类型...

    • XML:使用XML::toXMLString ...这将为您提供XML文字的基础...
    • Array:循环遍历它,并构建一个数组字面量
    • Number,int,uint,Boolean:对文字使用标准字符串表示
    • String:记住要转义字符串(换行符,反斜杠等)...最简单的方法是"unescape('"+escape(yourStringValue)+"');"...您当然可以使用转义序列创建一个普通的String文字...最简单的方法是@ 987654335@(使用 as3corelib)
    • Date:使用 "new Date("+yourDateValue.getTime()+");" 之类的东西......虽然值得怀疑,但对日期进行编码是否真的有意义......
    • DisplayObject 和子类:这不是小事,如果你真的想要……你需要找到一种方法来正确重建显示列表层次结构……
    • IEventDispatcher 和实现者:这完全不可能……没有办法找出注册到IEventDispatcher 的处理程序,而且您将很难从函数对象生成 ActionScript(非常不可能)…… 您将不得不选择递归方法...请注意,如果您想支持循环引用,这将更加困难...您可能想在设计算法之前做出决定...

    希望这会有所帮助...

    问候

    back2dos

    【讨论】:

    • 请注意,在 Flash IDE 中绘制的形状无法被 AS3 检索... :(
    【解决方案2】:

    flash.utils.describeType() 可能会有所帮助;)

    【讨论】:

      猜你喜欢
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      相关资源
      最近更新 更多