为什么System.Windows.Forms.Control没有标记为可序列化?

我无法深度复制UserControls,因为它们未标记为可序列化。

这个设计背后的原因是什么?

序列化一个控件不是问题,它正在反序化它,这是非常难以做到的。 期望这将产生控件的精确克隆。 这几乎是不可能准确的,有一个与控件相关的大量运行时状态。 不仅在Control类对象本身,也在窗口的内部状态,声明Windows不允许您直接访问。

但最终的问题是它具有与流程实例相关联的状态。 Windows窗口类名称和秘密属性访问键等重要的内部属性与程序的一次运行不同。 因此,在程序的先前运行或完全另一程序中序列化时重新创建控件是不可能的。

也就是说,Winforms设计者实际上支持控件序列化。 不是字节,它生成代码 。 在运行时重新创建控件的代码,与在设计时看起来相同。 减去大小和颜色等一大堆细节,它们在另一台机器上经常会有所不同。 设计者的最大优点是它只需要序列化控件的初始状态,它在构造函数时的状态。 在此之后的任何时候都做同样的事情,在Windows创建控件的窗口并向它发送一堆消息之后,这是一个非常难以破解的难题。 这是一个臭虫工厂。 因此不受支持。

Usercontrols是一个可视元素,为什么你会想要序列化它们? 您永远不会通过WCF服务发送它们,也不会将它们流式传输到数据存储库。 如果您需要传输或存储用户控件,那么您将存储其关键属性并在必要时重新创建它们。

而不是使用序列化来创建克隆,而是使用更传统的方法,例如手动复制已知类型的特定属性,或使用reflection。

您可以序列化控件,但不能通过标准序列化器。 如果您想序列化表单上的一个或多个控件来保存表单设计和/或其他控件属性,您可以使用visual studio使用的相同序列化(通过CodeDomSerializer),但是您需要实现几个类(我认为至少IDesignerSerializationManager)。 你可以在这里看到一个样本

http://support.microsoft.com/default.aspx?scid=kb;en-us;813808

序列化在类SampleDesignerLoader方法Flush中。

在同一方法中,XML流中还有一个序列化,它不使用visual studio使用的类。

在同一个类中,有来自XML的反序列化。