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

#vb.net #winforms #visual-studio-2010 #serialization #binary-serialization

#vb.net #winforms #visual-studio-2010 #сериализация #двоичный файл-сериализация

Вопрос:

Я пытаюсь сериализовать основной класс в моем решении на 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: " amp; ex.Message)
        Throw
    End Try
End Sub
  

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

Введите ‘System.Windows.Формы.Форма’в системе Assembly’.Windows.Формы, версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken=b77a5c561934e089′ не помечены как сериализуемые.

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

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

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

Ответ №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: " amp; ex.Message)
        Throw
    End Try
End Sub
  

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

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

Комментарии:

1. Спасибо, это объясняет ошибку. Проблема в том, что у меня довольно большое количество этих объектов в классе Form1 (все сериализуемые, насколько я знаю), и я надеялся избежать явной сериализации каждого из них. Если я перемещу объекты, которые хочу сохранить, в отдельный класс, это сработает? В противном случае, можете ли вы объяснить, почему мне нужно десериализовать в том же порядке? Приветствия

2. @Andrew: Да, помещение их в отдельный класс должно сработать. Вам нужно пометить этот класс как <Serializable()> . В любом случае рекомендуется разделять пользовательский интерфейс (Form1) и данные (ваш новый класс).

3. @Andrew: Вам нужно десериализовать их в том же порядке, потому что ваш файловый поток будет содержать bytesForObject1 bytesForObject2 ... , и восстановление object2 из bytesForObject1 не сработает. 😉