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

时间:2012-02-03 10:37:41

标签: c# .net visual-studio oop c#-4.0

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

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

3 个答案:

答案 0 :(得分:11)

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

但最终的问题是它具有与流程实例相关联的状态。 Windows窗口类名称和secret属性访问键等重要的内部属性与程序的一次运行不同。因此,无法在上次运行程序或其他程序中序列化时重新创建控件。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

序列化在Class SampleDesignerLoader方法Flush。

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

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