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

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

2 голосов
/ 05 апреля 2011

Я пытаюсь сериализовать основной класс в своем решении 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.

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

1 Ответ

3 голосов
/ 05 апреля 2011

Поскольку 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

Следует обратить внимание на две вещи:

  • Классы всех объектовВы хотите сериализовать (объект1, объект2, ...) должны быть помечены как <Serializable()>.Вы можете проверить это в документации (пример: Hashtable помечен как сериализуемый).
  • Обязательно десериализуйте объекты в том же порядке.
...