#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
не сработает.![]()