DEEP COPY na ArrayList (! shallow clone)
2 отговора
129 прегледа
DEEP COPY na ArrayList (! shallow clone)
Здравите.
Имам ARRAYLIST с елементи референции към мой класове.
искам да направя копие на този АRRAYLIST, в което да обработвам стойностите
на обектите вътре, без това да Афектира оригиналният списък.
със стандартният .Clone() metod, ми копира простите стойноети, но запазва референциите към обектите, т.е не ми прави т.нар Deep Copy.
опитах с МЕМОРИ СТРИИМ, но моите класове трябва да имплементират ICLONABLE или ISERIALIZABLE, което не е така...
даите неква идея, освен да вървя по методите чрез рефлекшъна и да ги копирам едно по едни пропъртитата на моите обекти....
уфф.....
Имам ARRAYLIST с елементи референции към мой класове.
искам да направя копие на този АRRAYLIST, в което да обработвам стойностите
на обектите вътре, без това да Афектира оригиналният списък.
със стандартният .Clone() metod, ми копира простите стойноети, но запазва референциите към обектите, т.е не ми прави т.нар Deep Copy.
опитах с МЕМОРИ СТРИИМ, но моите класове трябва да имплементират ICLONABLE или ISERIALIZABLE, което не е така...
даите неква идея, освен да вървя по методите чрез рефлекшъна и да ги копирам едно по едни пропъртитата на моите обекти....
уфф.....
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
Ето малко код:
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
10x, шефе :)
стана ...
(тоя пример го видех в нета, ама не бях направил обектите да се СЕРИАЛАЙЗАБЪЛ) - пак съм спал :)
10х
(тоя пример го видех в нета, ама не бях направил обектите да се СЕРИАЛАЙЗАБЪЛ) - пак съм спал :)
10х