如何序列化和反序列化我的主窗体(及其控件,子控件,它们的值等)?
编辑,以便澄清。目前,我正在将每个控件的当前值逐个写入.INI文件,并在下次运行程序时将其读回。每次添加新控件时,我都要记得更新保存/加载.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
可能稍后添加左/上/高/宽/启用/可见等,不是因为控件名称的“值”就足够了(文本,值,行,检查?等)
答案 0 :(得分:6)
对于序列化.NET表单和控件没有开箱即用的支持。控件未标记[Serializable]属性。
我认为大多数难度都围绕着.NET控件,它们本身就是原生Win32控件的包装器。似乎将原生状态保持为XML似乎是不可行的。
也许有人写过自定义序列化程序;如果没有,你可能需要自己动手。
修改强>
我在experts exchange上发现这个令人沮丧的接受答案:
您必须实现ISerializable 或者IXmlSerializable才能做到 类似的东西(取决于如何 你想序列化表格)。 这不是微不足道的。
答案 1 :(得分:3)
序列化整个控件听起来像一个困难的命题。但是,如果你想在该控件中序列化数据,那肯定是可能的,假设你的结构很好。
例如,假设您的AddressBook应用程序中有一个Person
List
Address
个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
对象:
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
如果将此数据绑定到表单,则可以轻松地将其序列化并反序列化为XML。序列化:
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
要反序列化:
{{1}}
我从this answer了解了XML序列化到我之前提出的一个问题。
当然,如果你手动从表单中加载/提取数据,这是行不通的。我的好主意可能是为类中的表单封装您的基础数据,然后将该类绑定到表单。这样,您就可以轻松地序列化/反序列化表单中的数据。