Vb.net 如何序列化和反序列化表单?

Vb.net 如何序列化和反序列化表单?,vb.net,winforms,serialization,Vb.net,Winforms,Serialization,如何序列化和反序列化主窗体及其控件、子控件及其值等 编辑,以便澄清。目前,我正在将每个控件的当前值逐个写入一个.INI文件,并在程序下次运行时将其读回。每次添加新控件时,我都必须记住更新save/load.INI代码 我只是想知道我是否可以在一个调用中完成,或者在表单上的所有控件上进行一个简单的for循环迭代 顺便说一句,我只使用简单的控件,如编辑框、单选按钮、组合框、checkd列表框,我拥有的最复杂的东西是一个数据网格,但即使它没有链接到数据库 公认的答案是不可能的。我可能会编写自己的代码,

如何序列化和反序列化主窗体及其控件、子控件及其值等

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

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

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

公认的答案是不可能的。我可能会编写自己的代码,大致如下

对于每个子控件,recursivley

 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等,但无论是否使用经济控件名称,其值是否足够文本、值、行数、选中数等

都不支持序列化.NET表单和控件。控件未标记为[Serializable]属性

我认为大部分困难都围绕着.NET控件,它们实际上是本机Win32控件的包装。将本机状态持久化为XML似乎是不可行的

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

编辑:

我发现这个令人沮丧的公认答案是:

您必须实现ISerializable 或IXmlSerializable,以便 这取决于你怎么做 是否要序列化表单。 这不是小事

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

例如,假设您有一个Person对象,其中包含AddressBook应用程序的地址列表:

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
我从中了解了XML序列化,并回答了我以前提出的一个问题


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

您能否提供更多有关您正在尝试执行的操作的信息?您只是想在程序执行之间保存窗体的状态吗?