2012-04-16 2 views
3

В AS3 можно скопировать массив двумя способами:глубокая копия вектора в AS3

newArr = oldArr.concat(); 

или

var ba:ByteArray = new ByteArray(); 
ba.writeObject(oldArr); 
ba.position = 0; 
newArr = ba.readObject() as Array; 

Но эти два способа не работают с векторными, когда мне нужно скопировать вектор со сложным типом данных. Как и в случае с Vector.<Point>. Когда я использую ByteArray для копирования Vector со сложным типом данных, компилятор говорит, что новый вектор I копирует старый в null.

ответ

3

Зарегистрируйте псевдоним класса с flash.net.registerClassAlias перед записью своего объекта в ByteArray, например .:

var points:Vector.<Point> = new Vector.<Point>(); 
var pointsCloned:Vector.<Point>; 
var ba:ByteArray = new ByteArray(); 

registerClassAlias("flash.geom.Point", Point); 

points.push(new Point(1, 2)); 
points.push(new Point(3, 4)); 
points.push(new Point(5, 6)); 

ba.writeObject(points); 
ba.position = 0; 
pointsCloned = ba.readObject() as Vector.<Point>; 

trace(points); 
trace(pointsCloned); 

Благодаря этому blog post!

+0

О, это работает well.Thanks! Но почему он может работать сразу после регистрации псевдонима класса? – Piggyi

+0

@Piggyi Вы можете найти краткое объяснение в [Справочнике по ActionScript 3.0] (http://livedocs.adobe.com/livecycle/8.2/programLC/common/langref/flash/net/package.html#registerClassAlias%28%29). Это все, что я знаю. – Matthias

0

Другим вариантом было бы использовать .map(), что-то вроде:

function pointCloner(item:Point, index:int, vector:Vector.<Point>):Point { 
    return item.clone(); 
} 

var newVector:Vector.<Point> = oldVector.map(pointCloner); 
Смежные вопросы