背景
我正在尝试创建我在 VB.NET 中创建的业务对象的副本。我已经实现了 ICloneable 接口,并且在 Clone 函数中,我通过使用 BinaryFormatter 对其进行序列化来创建对象的副本,然后直接反序列化回从函数返回的另一个对象。
我尝试序列化的类与该类中包含的子对象一起标记为“可序列化”。
我已经通过编写类似于以下的代码测试了克隆方法的工作原理:
Dim obj as New Sheep()
Dim dolly as Sheep = obj.Clone()
此时一切正常。
问题
我有一个继承自第 3 方控件的自定义 Windows 窗体控件。这个自定义控件基本上包含我想要克隆的对象(因为这个对象最终提供给第 3 方控件)。
我想在 windows 窗体控件中创建对象的克隆,以便我可以允许用户操作属性,同时可以选择取消更改并将对象恢复到更改之前的状态。我想在用户开始进行更改之前获取对象的副本并保留它,以便在他们按取消时准备好它。
我的想法是按照以下内容编写代码:
Dim copy as Sheep = MyControl.Sheep.Clone()
然后允许用户操作MyControl.Sheep
. 但是,当我尝试这样做时,克隆方法会引发异常,说明:
程序集“My_Assembly_Info_Here”中的类型“MyControl”未标记为可序列化
在我调用BinaryFormatter.Serialize(stream,Me)
.
我尝试创建一个MyControl
返回对象副本的方法,并首先分配MyControl.Sheep
给另一个变量,然后克隆该变量,但似乎没有任何效果。但是,直接创建对象的新实例并克隆它可以正常工作!
知道我哪里出错了吗?
解决方案
马克的回答帮助我指出了正确的方向。 Rocky Lhotka 的这篇博客文章解释了这个问题以及如何解决它。