Как сериализовать и десериализовать форму? - PullRequest
0 голосов
/ 07 августа 2010

Как мне сериализовать и десериализовать мою основную форму (и ее элементы управления, субконтроли, их значения и т. Д.)?


Редактировать, для пояснения.В настоящее время я записываю текущее значение каждого элемента управления в файл .INI, один за другим, и считываю его при следующем запуске программы.Каждый раз, когда я добавляю новый элемент управления, я должен помнить, что нужно обновить этот код .INI для сохранения / загрузки.

Мне просто стало интересно, смогу ли я сделать это за один вызов или простой цикл for, повторяющий все элементы управления наформа.

Кстати, я использую только простые элементы управления, такие как поле редактирования, переключатель, поле со списком, список проверки, самое сложное, что у меня есть, - это сетка данных, но даже она не связана с базой данных.


Принятый ответ "не могу. Я, вероятно, напишу свой собственный, в соответствии с ...

для каждого дочернего элемента управления (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 и т. д., но для имени econtrol не достаточно его «значения» (текст, значение, строки, проверено? и т. д.)

Ответы [ 2 ]

6 голосов
/ 07 августа 2010

Нет встроенной поддержки для сериализации .NET форм и элементов управления. Элементы управления не помечены атрибутом [Serializable].

Я думаю, что большая часть трудностей связана с элементами управления .NET, которые действительно являются обертками родных элементов управления Win32. По-видимому, сохранение исходного состояния в виде XML было бы невозможным.

Возможно, кто-то написал собственный сериализатор; если нет, то вам, возможно, придется свернуть свой собственный.

Edit:

Я нашел этот обескураживающий принятый ответ на обмене экспертами :

Вы должны реализовать ISerializable или IXmlSerializable для того, чтобы сделать что-то подобное (в зависимости от того, как Вы хотите сериализовать форму). Это не тривиально.

3 голосов
/ 07 августа 2010

Сериализация всего элемента управления звучит как трудное предложение.Однако, если вы хотите сериализовать данные в этом элементе управления, это, безусловно, возможно, при условии, что они хорошо структурированы.

Например, допустим, у вас есть объект Person сList из Address для вашего приложения 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.Для сериализации:

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-сериализации из этого ответа на вопрос, который я задавал ранее.

Конечно, если вы вручную загружаете / извлекаете данные из форм, это не сработает.Хорошей идеей может быть инкапсуляция ваших базовых данных для формы в классе, а затем привязка этого класса к форме.Таким образом, вы можете легко сериализовать / десериализовать данные в форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...