【问题标题】:How to serialize and deserialize a form?如何序列化和反序列化表单?
【发布时间】:2011-03-26 15:30:15
【问题描述】:

如何序列化和反序列化我的主窗体(及其控件、子控件、它们的值等)?


编辑,澄清。目前,我正在将每个控件的当前值逐个写入 .INI 文件,并在下次运行程序时将其读回。每次添加新控件时,我都必须记住更新该保存/加载 .INI 代码。

我只是想知道我是否可以在一次调用中完成,或者一个简单的 for 循环遍历表单上的所有控件。

顺便说一句,我只使用简单的控件,如编辑框、单选按钮、组合框、选中列表框,我拥有的最复杂的东西是数据网格,但即使它也没有链接到数据库。


接受的答案“不能。我可能会编写自己的代码,类似于...

对于每个子控件(递归)

 if conrol is editbox ...

 if control is radiobutton ...

 if ... etc
   write control name to .ini file
   write control "value" to .ini file

以后可能会添加left/top/height/width/enabled/visible等,但不是控件名称及其“值”就足够了(文本、值、行、已检查?等)

【问题讨论】:

  • 你能提供更多关于你想要做什么的信息吗?您是否只是想在程序执行之间保存表单的状态?

标签: vb.net winforms serialization


【解决方案1】:

没有对序列化 .NET 表单和控件的开箱即用支持。控件未使用 [Serializable] 属性进行标记。

我认为大部分困难都围绕着真正封装了本机 Win32 控件的 .NET 控件。将原生状态保留为 XML 似乎是不可行的。

也许有人编写了自定义序列化程序;如果没有,您可能需要自己动手。

编辑:

我在experts exchange 上发现了这个令人沮丧的公认答案:

你必须实现 ISerializable 或 IXmlSerializable 以执行 类似的东西(取决于如何 你想序列化表格)。 这不是微不足道的。

【讨论】:

    【解决方案2】:

    序列化整个控件听起来是个困难的命题。但是,如果您想在该控件中序列化 数据,这当然是可能的,前提是您的结构良好。

    例如,假设您的地址簿应用程序有一个 Person 和 Address 的 Person 对象:

    Public Class Person
        Public Property PersonName As String
        Public Property PersonAge As Integer
        Public Property Addresses As New List(Of Address)()
    End Class
    
    Public Class Address
        Public Property StreetAddress As String
        Public Property City As String
        Public Property State As String
        Public Property Zip As String
    End Class
    

    如果将此数据绑定到表单,则可以轻松地将其序列化和反序列化到 XML 和从 XML 中反序列化。序列化:

    Imports System.Xml.Serialization  '<==you need to import this namespace '
    '...'
    
    Dim thisPerson As New Person()
    Dim serializer = new XmlSerializer(thisPerson.GetType())
    Using writer = XmlWriter.Create("thisPerson.xml"))
        serializer.Serialize(writer, thisPerson)
    End Using 
    

    反序列化:

    Dim thisPerson As New Person()
    Dim serializer As New XmlSerializer(thisPerson.GetType())
    Using reader = XmlReader.Create("thisPerson.xml")
        thisPerson = CType(serializer.Deserialize(reader),Person)
    End Using
    

    我从this answer 到我之前问过的一个问题了解了 XML 序列化。

    当然,如果您手动从表单中加载/提取数据,这将不起作用。我的好主意可能是将您的基础数据封装在一个类中的表单中,然后将该类绑定到表单。这样,您可以轻松地对表单中的数据进行序列化/反序列化。

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 2010-12-20
      • 1970-01-01
      • 2012-03-17
      • 2012-10-27
      相关资源
      最近更新 更多