Фон
Я пытаюсь создать копию бизнес-объекта, который я создал в VB.NET. Я реализовал интерфейс ICloneable, и в функции Clone я создаю копию объекта, сериализовав ее с помощью BinaryFormatter, а затем десериализовывая обратно в другой объект, который я возвращаю из функции.
Класс, который я пытаюсь сериализовать, помечается как «Сериализуемый» вместе с дочерними объектами, содержащимися в классе.
Я проверил, что метод клонирования работает путем написания кода, подобного следующему:
Dim obj as New Sheep()
Dim dolly as Sheep = obj.Clone()
На данный момент все работает нормально.
Задача
У меня есть пользовательский элемент управления форм Windows, который наследуется от стороннего элемента управления. Этот пользовательский элемент управления в основном содержит объект, который я хочу клонировать (поскольку этот объект ультимативно передает сторонний элемент управления).
Я хочу создать клон объекта в элементе управления формы Windows, чтобы я мог позволить пользователю манипулировать свойствами, имея возможность отмены изменений и возврата объекта к тому, что было до того, как они внесли изменения , Я хотел бы взять копию объекта до того, как пользователь начнет вносить изменения, и удерживать его, чтобы он был готов, если они нажмут кнопку отмены.
Я бы хотел написать код следующего содержания:
Dim copy as Sheep = MyControl.Sheep.Clone()
Затем разрешите пользователю манипулировать свойствами на MyControl.Sheep
. Однако, когда я пытаюсь сделать это, метод clone выдает исключение, заявляющее:
Тип 'MyControl' в сборке 'My_Assembly_Info_Here' не помечен как сериализуемый
Эта ошибка выдается в точке, где я звоню BinaryFormatter.Serialize(stream,Me)
.
Я попытался создать метод для MyControl
, который возвращает копию объекта, а также сначала присвоить MyControl.Sheep
другой переменной, а затем клонировать переменную, но, похоже, ничего не работает. Тем не менее, создание нового экземпляра объекта напрямую и его клонирование работает нормально!
Есть идеи, где я иду не так?
Решение
Ответ Марка помог мне направить меня в этом направлении. В этом блоге от Роки Лхотки объясняется проблема и способы ее решения.