Ошибка сериализации VB.NET

Я пытаюсь сериализовать основной класс в своем решении VB. Я добавил атрибут Serializable вверху своего класса, например:

<Serializable()>
Public Class Form1

и я использую следующий код для сериализации:

Public Sub serializeThis()
    Dim fStream As FileStream
    Try
        fStream = New FileStream("C:\ObjectData.bin", FileMode.Create)
        Dim bfmtr As New BinaryFormatter
        bfmtr.Serialize(fStream, Me)
        fStream.Close()
    Catch ex As Exception
        MsgBox("Failed to serialize: " & ex.Message)
        Throw
    End Try
End Sub

Когда я вызываю этот метод, я получаю сообщение об ошибке:

Тип «System.Windows.Forms.Form» в сборке «System.Windows.Forms, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089» не помечен как сериализуемый.

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

Могу ли я каким-то образом сериализовать все объекты, содержащиеся в моем классе Form1, не получая этой ошибки? Я не хочу хранить какие-либо данные об элементах управления формы, мне просто нужно сохранить все объекты, которые я определил в верхней части класса Form1.

Спасибо за любую помощь.


person Flash    schedule 05.04.2011    source источник


Ответы (1)


Поскольку Form не сериализуем, вы не можете сериализовать саму форму. (Форма не привязана к вашему классу Form1. Ваш класс Form1 является формой, поскольку он является производным от System.Windows.Forms.Form.)

Однако вы можете сериализовать только те объекты, которые хотите сериализовать:

Public Sub SerializeThis()
    Dim fStream As FileStream
    Try
        fStream = New FileStream("C:\ObjectData.bin", FileMode.Create)
        Dim bfmtr As New BinaryFormatter()

        bfmtr.Serialize(fStream, object1)
        bfmtr.Serialize(fStream, object2)
        bfmtr.Serialize(fStream, object3)
        ' ...

        fStream.Close()
    Catch ex As Exception
        MsgBox("Failed to serialize: " & ex.Message)
        Throw
    End Try
End Sub

Есть две вещи, на которые следует обратить внимание:

  • Классы всех объектов, которые вы хотите сериализовать (object1, object2, ...), должны быть помечены как <Serializable()>. Вы можете проверить это в документации (пример: Hashtable помечен как сериализуемый).
  • Обязательно десериализуйте объекты в том же порядке.
person Heinzi    schedule 05.04.2011
comment
Спасибо, это объясняет ошибку. Проблема в том, что у меня довольно много таких объектов в классе Form1 (насколько мне известно, все сериализуемые), и я надеялся избежать явной сериализации каждого из них. Если я перенесу объекты, которые хочу сохранить, в отдельный класс, это сработает? В противном случае, можете ли вы объяснить, почему мне нужно десериализовать в том же порядке? Ваше здоровье - person Flash; 05.04.2011
comment
@Andrew: Да, поместить их в отдельный класс должно сработать. Вам нужно пометить этот класс как <Serializable()>. В любом случае рекомендуется разделять пользовательский интерфейс (Form1) и данные (ваш новый класс). - person Heinzi; 05.04.2011
comment
@Andrew: вам нужно десериализовать их в том же порядке, потому что ваш файловый поток будет содержать bytesForObject1 bytesForObject2 ..., и реконструкция объекта2 из bytesForObject1 не сработает. ;-) - person Heinzi; 05.04.2011