我正在尝试做的是遍历一个对象,该对象也是一个复杂的对象树,并输出动作脚本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 ...听起来更简单,但我没有玩过,也不知道它可以走多少级别以及它的引用类型支持。
答案 0 :(得分:4)
一般情况下,这是不可能的,我担心...例如,你有readonly属性...而且,某些类的构造函数需要初始化值(虽然我个人认为这在大多数情况下不是很聪明,但是好的)...也有些对象可能是私有/内部类的实例,因此生成的实例化代码会抛出错误......
然而,您可以为没有这些问题的对象提供解决方案......
好的,基本上,flash.utils.describeType
会有很多帮助...它会给你一个对象的所有字段(也告诉你,它是否只读字段等),以及作为班级名称......
这将帮助您迭代对象属性...对于动态对象(describeType会告诉您),您还需要使用for-in循环遍历属性...使用*
作为类型对于迭代变量,这样它也可以与Dictionary
一起使用,例如......
然后你需要专门处理特定的内置类型......
XML
:使用XML::toXMLString
...这将为您提供XML
文字的基础...... Array
:遍历它,并构建一个数组文字Number
,int
,uint
,Boolean
:使用标准字符串表示形式String
:记得要逃避字符串(换行符,反斜杠等)......最简单的就是"unescape('"+escape(yourStringValue)+"');"
...你当然可以通过转义创建一个普通的String
字面值序列...最简单的方法是com.adobe.serialization.JSON.serialize(yourStringValue)
(使用as3corelib)Date
:使用类似"new Date("+yourDateValue.getTime()+");"
的内容......虽然这是有问题的,但是对日期进行编码是否真的有意义...... DisplayObject
和子类:这不会是微不足道的,如果你真的想要那样......你需要找到一种正确重建显示列表层次结构的方法...... IEventDispatcher
和实现者:这是不可能的......没有办法找出注册到IEventDispatcher
的处理程序,而且你将很难从函数对象生成ActionScript (很不可能)......
你必须选择一种递归的方法......请注意,如果你想支持循环引用,这将更加困难......你可能想在设计算法之前做出决定...... 希望这会有所帮助...
格尔茨
back2dos
答案 1 :(得分:1)
flash.utils.describeType()可能会有所帮助;)