Создание полной копии (deep copy) объекта - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет, понадобилось в проекте создать полную копию объекта, для чего воспользовался двоичной сериализацией:
Листинг программы
  1. public static class ExtensionMethods
  2. {
  3. public static T DeepClone<T>(this T obj)
  4. {
  5. using (var ms = new MemoryStream())
  6. {
  7. var formatter = new BinaryFormatter();
  8. formatter.Serialize(ms, obj);
  9. ms.Position = 0;
  10. return (T)formatter.Deserialize(ms);
  11. }
  12. }
  13. }
Все хорошо, но почему-то после этого ссылки на объект потерялись. Чтобы было понятнее, подготовил простой тестовый проект, где можно воспроизвести проблему.
Листинг программы
  1. [Serializable]
  2. public class DateAndTime
  3. {
  4. public bool Date { get; set; }
  5. public bool Time { get; set; }
  6. }
Листинг программы
  1. public partial class MainForm : Form
  2. {
  3. private DateAndTime obj;
  4. public MainForm()
  5. {
  6. InitializeComponent();
  7. obj = new DateAndTime();
  8. obj.Date = true;
  9. obj.Time = false;
  10. }
  11. private void btnOpen_Click(object sender, EventArgs e)
  12. {
  13. DateAndTime newObj = obj;
  14. ChildForm childForm = new ChildForm(newObj);
  15. childForm.ShowDialog(this);
  16. }
  17. }
Листинг программы
  1. public partial class ChildForm : Form
  2. {
  3. private DateAndTime parentObj = null; //parent object
  4. private DateAndTime newObj = null; //deep copy
  5. public bool Date
  6. {
  7. get { return chbDate.Checked; }
  8. set { chbDate.Checked = value; }
  9. }
  10. public bool Time
  11. {
  12. get { return chbTime.Checked; }
  13. set { chbTime.Checked = value; }
  14. }
  15. public ChildForm(DateAndTime obj)
  16. {
  17. InitializeComponent();
  18. parentObj = obj; //references are equal
  19. newObj = obj.DeepClone(); //deep copy made by binary serialization
  20. Date = newObj.Date;
  21. Time = newObj.Time;
  22. }
  23. private void btnSave_Click(object sender, EventArgs e)
  24. {
  25. parentObj = newObj;
  26. parentObj.Date = newObj.Date;
  27. parentObj.Time = newObj.Time;
  28. }
  29. }
Имеется две формы, при нажатии на кнопку Open на первой форме открывается вторая форма и в конструктор класса передается объект класса DateAndTime. После изменения настроек и их сохранения все изменения должны быть отражены и в объекте, который передавался в конструктор класса, но этого не происходит. Подскажите, пожалуйста, почему так происходит и что я сделал не так? Если не создавать полной копии и просто скопировать все поля класса DateAndTime в конструкторе, то все работает, как и ожидалось.

Решение задачи: «Создание полной копии (deep copy) объекта»

textual
Листинг программы
  1. public ChildForm(ref DateAndTime obj)
  2.         {
  3.             InitializeComponent();
  4.  
  5.             parentObj = obj; //references are equal
  6.             newObj = obj.DeepClone(); //deep copy made by binary serialization
  7.            
  8.             Date = newObj.Date;
  9.             Time = newObj.Time;
  10.         }
  11. ...
  12. //Ну и вызов
  13. private void btnOpen_Click(object sender, EventArgs e)
  14.         {
  15.             DateAndTime newObj = obj;
  16.             ChildForm childForm = new ChildForm(ref newObj);
  17.  
  18.             childForm.ShowDialog(this);
  19.             obj = newObj; // теперь эти переменные ссылаются на новый - deep copy - oбъект
  20.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы