DEEP COPY na ArrayList (! shallow clone)

2 отговора 129 прегледа
#1

DEEP COPY na ArrayList (! shallow clone)

Здравите.
Имам ARRAYLIST с елементи референции към мой класове.
искам да направя копие на този АRRAYLIST, в което да обработвам стойностите
на обектите вътре, без това да Афектира оригиналният списък.

със стандартният .Clone() metod, ми копира простите стойноети, но запазва референциите към обектите, т.е не ми прави т.нар Deep Copy.

опитах с МЕМОРИ СТРИИМ, но моите класове трябва да имплементират ICLONABLE или ISERIALIZABLE, което не е така...

даите неква идея, освен да вървя по методите чрез рефлекшъна и да ги копирам едно по едни пропъртитата на моите обекти....

уфф.....

Отговор
в отговор на Gogo #2

Re: DEEP COPY na ArrayList (! shallow clone)

има един прост начин който аз използвам от известно време и в мойте случаи работи екстра ... идеята е сериализираш, десериализираш и си готов с нов референс ... в най-лошия случай просто ще ти се наложи да добавиш [Serializable] на няколко класа

Ето малко код:


using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Collections;


/// <summary>
/// Creates a clone of an ArrayList object
/// </summary>
/// <param name="origList">
/// ArrayList to be deep cloned
/// </param>
/// <returns>
/// A completely new instance that what was passed in
/// </returns>

private ArrayList DeepClone(ArrayList origList)
{
. . . . MemoryStream mem = new MemoryStream();
. . . . try
. . . . {
. . . . . . . . BinaryFormatter bf = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
. . . . . . . . bf.Serialize(mem, origList);
. . . . . . . . mem.Seek(0, SeekOrigin.Begin);
. . . . . . . . return (ArrayList)bf.Deserialize(mem);
. . . . }
. . . . catch (Exception ex)
. . . . {
. . . . . . . . throw new ApplicationException("Deep copy operation failed", ex);
. . . . }
. . . . finally
. . . . {
. . . . . . . . mem.Close();
. . . . }
}

това е ...


XM TurboCT .. where comfort meets power
Отговор
в отговор на шeф нa Coди Дeвня #3

10x, шефе :)

стана ...

(тоя пример го видех в нета, ама не бях направил обектите да се СЕРИАЛАЙЗАБЪЛ) - пак съм спал :)

10х

Отговор