ПРОБЛЕМА:
У меня есть дочерний класс, который использует DataContractSerialization и вызывает событие Changed, когда установлено его свойство Name.
<DataContract()>
Public Class Child
Public Event Changed()
<DataMember()>
Private _Name As String
Public Sub New(ByVal NewName As String)
_Name = NewName
End Sub
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
RaiseEvent Changed()
End Set
End Property
End Class
Он содержится в родительском классе, который также использует DataContractSerialization и обрабатывает событие Changed дочернего элемента.
<DataContract()>
Public Class Parent
<DataMember()>
Private WithEvents Child As Child
Private Sub Child_Changed() Handles Child.Changed
'Handle changed event here...
End Sub
End Class
Родительский класс сериализуется и десериализуется, и все данные (включая Дочерний) сохраняются и восстанавливаются, как и ожидалось.
Однако после десериализации событие Changed никогда не возникает!
ВОПРОСЫ:
Я знаю, что процесс десериализации обходит конструкторы классов, но разве событие не должно инициализироваться?
Я что-то не так делаю?
Можно ли сериализовать / десериализовать событие?
Есть ли лучший обходной путь, чем следующий (см. Ниже)?
Есть ли способ инициализировать событие в методе OnDeserialzed для Child, а не для Parent (см. Ниже)?
Временное решение:
(1) Добавить конструктор к классу Child, который в качестве аргумента принимает экземпляр себя.
(2) Добавьте метод OnDeserialized к классу Parent, который создает экземпляр New класса Child на основе десериализованного экземпляра класса Child.
<OnDeserialized()>
Private Sub OnDeserializedMethod(ByVal Context As StreamingContext)
Child = New Child(Child)
End Sub
Теперь событие Changed вызывается, как и ожидалось.