Своего нового для Flex и ActionScript, так голого со мной.Как создать неопубликованную копию объекта в ActionScript
У меня есть ArrayCollection, полный пользовательских объектов. Мне нужно создать копию этого массива, выполнить некоторые функции и модификации как для массива, так и для объектов внутри. Затем мне нужно вначале сбрасывать его обратно в оригинальную сохраненную копию до того, как я начал.
Проблема (и ошибка, которую я нашел и пытаюсь исправить) заключается в том, что я не могу создать копию этого массива, которая напрямую не ссылается на оригинал. т.е.: модификации к копии также изменят оригинал.
private var original:ArrayCollection = new ArrayCollection();
...
private function doStuff()
{
var modified:ArrayCollection = original;
for each (var myObj:CustomObject in modified)
...
}
Ближайший я сумел получить использовал ObjectUtil.clone ...
private var original:ArrayCollection = new ArrayCollection();
...
private function doStuff()
{
var modified:ArrayCollection = ObjectUtil.clone(original);
for each (var myObj:CustomObject in modified)
{
//Error here as the clone worked, however the objects in the array reverted to the base Object Class and couldn't be cast back to their actual CustomObject type
}
}
Вот рабочий пример:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
creationComplete="application1_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
private var originals:ArrayCollection;
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
originals = new ArrayCollection();
for (var i:int = 0; i <= 5; i++)
{
var myObj:CustomObject = new CustomObject();
originals.addItem(myObj);
}
doStuff();
}
private function doStuff():void
{
var modified:ArrayCollection = clone(originals);
for (var i:int = 0; i < modified.length; i++)
{
var myDupObj:CustomObject = modified[i] as CustomObject;
//do stuff
trace(myDupObj);
}
}
private function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
</s:Application>
И CustomObject.as
package
{
public class CustomObject
{
public var a:String;
public var b:String;
public var c:String;
public function CustomObject()
{
a = "Hello";
b = "World";
c = "Good-Bye";
}
}
}
Проблема, которую я имел с клоном, как я уже говорил в комментариях было то, что все объекты в массиве вернулись к классу базового объекта и будут бросать исключение приводки при попытке приведения их к соответствующему объекту тип. Я видел и пробовал функцию, которую вы опубликовали, с тем же результатом. – kweb
Я также пробовал перебирать исходный массив и клонировать отдельные объекты ... ie: modified.addItem (клон (оригиналы [i]) как CustomObject); Это приводит к массиву нулевых объектов. – kweb
КАК вы предоставляете исполняемый образец? – JeffryHouser