我正在尝试对flash.geom.Rectange
对象进行JSON编码和解码。解码对象时,它的类型为Object
。如果我尝试将其强制转换为Rectangle
,我会得到一个空对象:
var rect:Rectangle = JSON.decode(json_string) as Rectangle;
看起来我无法从Object转换为与Rectangle具有完全相同属性的Rectangle。
一个选项是将属性从Object复制到Rectangle。
我正在查看introspection of objects但是,迭代对象的属性只会深入一级。如果正在复制的属性的类型为Point
,则不会复制Point
的属性。看起来我必须递归复制它们。
动作脚本中是否有深度复制对象的函数?
答案 0 :(得分:4)
简答 - 否。您必须将已解码的JSON对象的组件传递给新的Rectangle。
var jRect:Object = JSON.decode(json_string);
var rect:Rectangle = new Rectangle(jRect.x, jRect.y, jRect.width, jRect.height);
在这种情况下,您很幸运,因为您提到的点是从构造函数值推断出来的。对于更复杂的类,我通常从JSON方法创建类级别。
答案 1 :(得分:0)
这是我提出的复制功能。使用像Rectangle这样的简单类型进行测试。 那里有一个try / catch语句,因为当我尝试写入只读属性时,我遇到异常。应该有一个if语句来检查属性是否可写,但我现在没有时间或耐心。我稍后会回来改进它,但现在它是:
public static function copy(source:Object, dest:Object):void
{
for (var prop in source)
{
if (getQualifiedClassName(source[prop]) == "Object")
{
copy(source[prop], dest[prop]);
}
else
{
try // bad. should really be an if statement to check if property is writable.
{
dest[prop] = source[prop];
}
catch (err:Error) {}
}
}
}