Кой начин за deep cloning да предпочета?


0
В момента съм на домашното от OOP CTS и трябва да направя Deep Cloning на собствен обект. Задачата няма значение, защото въпросът е принципен.Тъй като има няколко начина да се направи deep clone:
1. Сериализиране и десериализиране на обекта
2. Чрез рефлексия и рекурсия
3. чрез извикване на пълен конструктор на класа
4. чрез MemberwiseClone и дообработка на елементите на обекта, които са референтни типове
Как се решава кой от тях да се използва в конкретна ситуация?

в C# OOP от ttitto (1950 точки)


Отговори



0
Ами ... решава се спрямо конкретния случай предполагам.
Ако имаш метод който няма много вложени структури спокойно можеш в clone да си извикаш конструктора който да ти създаде нов елемент. Но ако структурата ти е много "обрасла" и нямаш идея какво точно ще ти подадат... тогава трябва да се мисли някакъв начин чрез който метода clone да обходи структурата и да й направи копие без да се интерсува много от конкретната имплементация.
П.С. Още не знам какво е това "сериализация и десериализация"... вероятно ще ми стане ясно по някое време :)

от JulianG (5316 точки)


1
Ако разбираме едно и също по deep clone (пресъздаване на целия граф обекти с корен текущия), лично аз бих избрал вариант 1 или 2:
1 - ако става дума за двоична сериализация е окей; XML сериализацията не запазва референтността
2 - също няма проблем, стига да можеш да го напишеш :-)
3 - решение само в много частен случай
4 - "дообработката" на референтните полета трябва да се случи по някакъв начин, така че пак опираш до случаи 1 и 2

от staafl (5770 точки)


0
Благодаря! Въпросът ми по-скоро е насочен към това, кои особености на класа, който ще се клонира ни показват кой от методите за клониране да се използва?

от ttitto (1950 точки)

0
Ами, което работи. За двоична сериализация, класовете на обектите трябва да са маркирани подходящо, така че ако нямаш контрол върху тях, най-добре с рефлекция.

от staafl (5770 точки)