Então... como diria Didi Mocó, "vareia" =)

O que o copy faz é serializar o objeto inteiro para um ByteArray e então
desserializar o objeto em um novo objeto.

Funciona? Em termos... Devemos lembrar que o AS é uma linguagem dinâmica, ou
seja, você pode ter uma classe dinâmica (public dynamic class) que cria
automaticamente as propriedades caso estas não existam.

O fato é que a desserialização opera com objetos dinâmicos, portanto, a
cópia seria um DynamicObject ao invés de um TipoDaClasse.

Pro contexto do DataGrid, sem muitos problemas, já que o DataGrid não se
importaria com isso... Mas para outros casos, isso poderia gerar alguns
problemas (ter que registrar, etc.), além do impacto de performance da cópia
feita desta forma.

Um outro problema que pode gerar MUITA dor de cabeça é a recursão: a
serialização serializa o objeto inteiro (deep copy), então se houver uma
referência circular, o que é comum para hierarquia, stack overflow na veia
=)

Eu diria que, para poucas iterações na cópia (como é o caso aqui),
funcionaria de boa... Já pra clonar vários objetos eu não botaria muita fé
não... iria impactar na já frágil performance do Flex.

Aí fica à escolha do programador, mas sem dúvida teu comentário facilitaria
bastante neste caso =)


2010/1/22 José Alexandre D'Abruzzo Pereira <[email protected]>

> Será que neste caso ele não poderia usar o ObjectUtil.copy(itemADuplicar)
> ???
> Júlio, vc sabe se este método tem algum problema de performance? Pq parece
> uma solução mais simples...
>
> Acho que o único problema seria o que está explicado neste post:
> http://www.darronschall.com/weblog/2007/08/on-transient-objectutilcopy-and-casting.cfm
> Talvez seja necessário registrar a classe antes de copiar o objeto.
>
>
> []'s
> Zé Alexandre
>
> 2010/1/22 Júlio César Ködel <[email protected]>
>
>> Só remendando um erro meu:
>>
>> Infelizmente o Flex não possue a interface ICloneable, então a função
>> clone é específica da sua classe.
>>
>> Confundi com .net onde tenho a interface ICloneable =)
>>
>> A única desvantagem disso é que você não conseguiria automatizar a
>> clonagem de objetos em uma função genérica (mas também nada impede do seu
>> aplicativo definir a interface ICloneable... é apenas um facilitador e nem
>> importa muito para o teu caso).
>>
>> 2010/1/22 Lorenzi <[email protected]>
>>
>>> Valeu Julio obrigado pela resposta vou testar isso..
>>>
>>>
>>> On 22 jan, 19:09, Júlio César Ködel <[email protected]> wrote:
>>> > Uma coisa que vocês tem que ter noção é que o grid, ou qualquer outro
>>> > componente de lista do Flex NÃO POSSUEM ITENS NEM LINHAS!
>>> >
>>> > Ele simplesmente apresenta os dados providos na propriedade
>>> dataProvider.
>>> >
>>> > Portanto, o que você quer fazer é simplesmente copiar um elemento do
>>> array
>>> > para outra posição.
>>> >
>>> > Mas aí temos as pegadinhas. Rá! =)
>>> >
>>> > Arrays, por padrão, são imutáveis, ou seja, não é nada bom adicionar
>>> itens
>>> > neles (já que eles alocam um espaço em memória com apenas um ponteiro e
>>> > adicionar um item nestes caras implica, implicita ou explicitamente, em
>>> > copiar todo o array antigo para uma nova localização na memória + o
>>> item a
>>> > ser inserido).
>>> >
>>> > Por isso a grande maioria das operações feitas em listas no Flex são
>>> através
>>> > do ArrayCollection, que são listas de dados onde novos dados podem ser
>>> > adicionados mais facilmente (e há mecanismos internos para prover
>>> > performance a esta operação).
>>> >
>>> > O grande problema é que cada item do ArrayCollection é um objeto. E o
>>> que é
>>> > um objeto? Apenas um inteiro apontando para uma estrutura da memória.
>>> Então
>>> > copiar o objeto para outra posição do array na verdade não o copia,
>>> apenas
>>> > copia sua referência (o que implica que uma alteração no item original
>>> seja
>>> > imediatamente replicada para os itens copiados já que eles são a mesma
>>> > coisa, a mesma estrutura em memória).
>>> >
>>> > Para isso o ActionScript define uma interface para adicionar o método
>>> Clone
>>> > em um objeto. Cabe a você, programador, implementar o mecanismo de
>>> clone na
>>> > sua classe que implica, basicamente, em criar uma nova instância do
>>> tipo
>>> > desejado e copiar cada uma das propriedades para esta nova instância,
>>> > gerando assim uma cópia real do objeto.
>>> >
>>> > Então, vamos supor sua classe:
>>> >
>>> > public class MinhaClasse
>>> > {
>>> >   public var nome:String;
>>> >   public var idade:int;
>>> >
>>> > }
>>> >
>>> > Ficaria assim:
>>> >
>>> > public class MinhaClasse
>>> > {
>>> >   public var nome:String;
>>> >   public var idade:int;
>>> >
>>> >   public function clone():MinhaClasse
>>> >   {
>>> >     var copia:MinhaClasse = new MinhaClasse();
>>> >
>>> >     copia.nome = this.nome;
>>> >     copia.idade = this.idade;
>>> >     return copia;
>>> >   }
>>> >
>>> > }
>>> >
>>> > Aí no teu grid, você poderia fazer:
>>> >
>>> > (grid.dataProvider as ArrayCollection).addItem(itemADuplicar.clone());
>>> >
>>> > E, pronto, você tem um item duplicado na sua estrutura de dados.
>>> >
>>> > Note, obviamente, que se sua classe tiver um atributo/propriedade que
>>> seja
>>> > não primitivo, você deverá clonar este elemento também, ou seja,
>>> supondo que
>>> > NOME seja uma classe sua composta pelos campos nome e sobrenome. Não
>>> > adiantaria fazer copia.nome = this.nome porque, novamente, você estaria
>>> > apenas duplicando o ponteiro. Neste caso o mesmo esquema deveria ser
>>> > adotado: copia.nome = this.nome.clone();
>>> >
>>> > 2010/1/22 Lorenzi <[email protected]>
>>> >
>>> >
>>> >
>>> >
>>> >
>>> > > Boa tarde.
>>> >
>>> > > Seguinte minha duvida é essa tenho um  datagrid com tres colunas
>>> nome,
>>> > > idade, duplicar(este sera um botao para o cara clicar) . Minha duvida
>>> > > é como eu faço para clicar no duplicar e ele criar uma nova linha no
>>> > > grid, copiando a linha clicada.
>>> >
>>> > > /*normal*/
>>> > > Nome            idade      Duplicar
>>> > > Marcelo           23            +
>>> >
>>> > > /*duplicado*/
>>> > > Nome            idade      Duplicar
>>> > > Marcelo           23            +
>>> > > Marcelo           23            +
>>> >
>>> > > /*duplicado*/
>>> > > Nome            idade      Duplicar
>>> > > Marcelo           23            +
>>> > > Marcelo           23            +
>>> > > Marcelo           23            +
>>> >
>>> > > desta maneira.
>>> >
>>> > > Grato.
>>> >
>>> > > --
>>> > > Você recebeu esta mensagem porque está inscrito na lista "flexdev"
>>> > > Para enviar uma mensagem, envie um e-mail para
>>> [email protected]
>>> > > Para sair da lista, envie um email em branco para
>>> > > [email protected]
>>> > > Mais opções estão disponíveis emhttp://
>>> groups.google.com/group/flexdev
>>> >
>>> > --
>>> > []
>>> > Júlio César Ködel G.
>>>
>>> --
>>> Você recebeu esta mensagem porque está inscrito na lista "flexdev"
>>> Para enviar uma mensagem, envie um e-mail para [email protected]
>>> Para sair da lista, envie um email em branco para
>>> [email protected]
>>> Mais opções estão disponíveis em http://groups.google.com/group/flexdev
>>>
>>
>>
>>
>> --
>> []
>> Júlio César Ködel G.
>>
>> --
>> Você recebeu esta mensagem porque está inscrito na lista "flexdev"
>> Para enviar uma mensagem, envie um e-mail para [email protected]
>> Para sair da lista, envie um email em branco para
>> [email protected]
>> Mais opções estão disponíveis em http://groups.google.com/group/flexdev
>>
>
>
>  --
> Você recebeu esta mensagem porque está inscrito na lista "flexdev"
> Para enviar uma mensagem, envie um e-mail para [email protected]
> Para sair da lista, envie um email em branco para
> [email protected]
> Mais opções estão disponíveis em http://groups.google.com/group/flexdev
>



-- 
[]
Júlio César Ködel G.

-- 
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para [email protected]
Para sair da lista, envie um email em branco para 
[email protected]
Mais opções estão disponíveis em http://groups.google.com/group/flexdev

Responder a