【发布时间】:2010-09-27 20:13:22
【问题描述】:
问题:
我有一个 Child 类,它使用 DataContractSerialization 并在设置其 Name 属性时引发 Changed 事件。
<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
它包含在一个 Parent 类中,该类也使用 DataContractSerialization 并处理 Child 的 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
Parent 类被序列化和反序列化,所有数据(包括 Child)都按预期保存和重新存储。
但是,在反序列化之后,Changed 事件永远不会引发!
问题:
我知道反序列化过程绕过了类构造函数,但是事件不应该被初始化吗?
我做错了吗?
是否可以序列化/反序列化事件?
是否有比以下更好的解决方法(见下文)?
有没有办法在 Child 而不是 Parent 的 OnDeserialzed 方法中初始化事件(见下文)?
解决方法:
(1) 向 Child 类添加一个构造函数,该构造函数将自身的实例作为参数。
(2) 在Parent类中添加一个OnDeserialized方法,该方法基于Child类的反序列化实例创建一个Child类的New实例。
<OnDeserialized()>
Private Sub OnDeserializedMethod(ByVal Context As StreamingContext)
Child = New Child(Child)
End Sub
现在 Changed 事件按预期引发。
【问题讨论】:
标签: .net vb.net events datacontractserializer