Страница: 1 |
Страница: 1 |
Вопрос: Проблемы с Серелизацией
Добавлено: 23.09.04 14:59
Автор вопроса: danser | ICQ: 299287824
Есть два простых класа. Причем поле класа B имеет тип А.
<Serializable()> Public Class A
Public Event EventA()
Private A1_ As String
Public Property A1() As String
Get
A1 = Me.A1_
End Get
Set(ByVal Value As String)
Me.A1_ = Value
RaiseEvent EventA()
End Set
End Property
End Class
<Serializable()> Public Class B
Private WithEvents B1_ As New A()
Public Property B1() As A
Get
B1 = Me.B1_
End Get
Set(ByVal Value As A)
Me.B1_ = Value
End Set
End Property
Private Sub B1__EventA() Handles B1_.EventA
MsgBox("Поле B2 изменено")
End Sub
End Class
Стандартные операции для сохранения в файле:
Dim saveFile As FileStream
saveFile = File.Create(Path)
Dim BFormatter As New BinaryFormatter()
BFormatter.Serialize(saveFile, CType(Me.Obj, B))
saveFile.Close()
и открития из файла:
Dim openFile As FileStream
openFile = File.OpenRead(Path)
Dim BFormatter As New BinaryFormatter()
Dim OpenB As New B()
OpenB = CType(BFormatter.Deserialize(openFile), B)
openFile.Close()
При сохранении вроде нормально, при откритии матерится. Вот мат:
Serialization will not deserialize delegates to non-public methods.
Если клас В писать так то нормально и сохраняет и откривает:
<Serializable()> Public Class B
Private B1_ As New A()
Public Property B1() As A
Get
B1 = Me.B1_
End Get
Set(ByVal Value As A)
Me.B1_ = Value
End Set
End Property
End Class
Но мне надо отслеживать если меняется свойство B1 класа B.
ВОПРОС: В чем тут проблема?
Ответы
Всего ответов: 4
Номер ответа: 1
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #1
Добавлено: 23.09.04 15:26
Он не может сериализовать делегат... И это в принципе правильно.
Наверное, надо изменить логику сериализации, запретив сериализовать
делегат, а делегат создавать вручную после десериализации.
Номер ответа: 2
Автор ответа:
danser
ICQ: 299287824
Вопросов: 76
Ответов: 209
Профиль | | #2
Добавлено: 23.09.04 19:37
Что такое д е л е г а т ?
(Ссылочку там или в двух словах если не трудно...)
Номер ответа: 3
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #3
Добавлено: 24.09.04 09:11
Грубо говоря, это ссылка на функцию.
Почитай в MSDN.....
Номер ответа: 4
Автор ответа:
Артём Л.
ICQ: 280044491
Вопросов: 43
Ответов: 227
Профиль | | #4
Добавлено: 24.09.04 11:26
делегат это действительно выполняет функцию по ее ссылке...
на самом деле, делегат - это класс, который имеет методы Invoke,
BegineInvoke, EndInvoke, которые и служат для вызова этой функции