RaiseEvent没有';在vb.net中被反序列化函数调用时不会引发

RaiseEvent没有';在vb.net中被反序列化函数调用时不会引发,vb.net,serialization,raiseevent,Vb.net,Serialization,Raiseevent,我有一个可序列化的类 <Serializable()> Public Class SACCVar Private _ConsigneCompression As Integer Public Event VariableChanged(ByVal Val As Object, ByVal Old_Val As Object, desc As String) Public Property ConsigneCompression As Integer Get

我有一个可序列化的类

<Serializable()> Public Class SACCVar

Private _ConsigneCompression As Integer

Public Event VariableChanged(ByVal Val As Object, ByVal Old_Val As Object, desc As String)

Public Property ConsigneCompression As Integer

    Get
        Return _ConsigneCompression
    End Get
    Set(value As Integer)
        Tmp_Val = _ConsigneCompression
        _ConsigneCompression = value
        RaiseEvent VariableChanged(_ConsigneCompression, Tmp_Val, "ConsigneCompression")
    End Set
End Property End Class
在代码中,当我这样做

SaccData.ConsigneCompression = 1234
它叫SaccVarChanged

但当我调用反序列化类的子程序时,它会传递“公共属性”中代码的RaiseEvent VariableChanged部分。但它并没有提高潜水艇的安全性

有什么我能做的吗? 多谢各位

编辑: 以下是我的序列化/反序列化代码:

  Dim fichier As String
    fichier = Fichier_SACC
    ' Déclaration
    Dim XSSACC As New XmlSerializer(SaccData.GetType)
    Dim streamSACC As FileStream
    If Not File.Exists(fichier) Then
        'Exit Sub
        'TODO gestion erreur
    Else
        streamSACC = New FileStream(fichier, FileMode.Open)
        Try
            SaccData = CType(XSSACC.Deserialize(streamSACC), SACCVar)


        Catch ex As Exception
            ' Propagrer l'exception
            Throw ex
        Finally
            ' En cas d'erreur, n'oublier pas de fermer le flux en lecture si ce dernier est toujours ouvert
            streamSACC.Close()
        End Try
    End If




            Dim StreamSACC As New StreamWriter(Fichier_SACC)
    Dim serialiseSACC As New XmlSerializer(SaccData.GetType)
    Try
        serialiseSACC.Serialize(StreamSACC, SaccData)
    Catch ex As Exception
        Throw ex
    Finally
        StreamSACC.Close()
    End Try

好了,我终于开始工作了

多亏了这里:

我发现反序列化会删除事件的处理程序。反序列化似乎创建了我的对象的一个新实例。 链接中给出的解决方案类似于:

        <OnDeserialized()>
Private Sub OnDeserializedMethod(ByVal Context As StreamingContext)

        AddHandler Child.Changed AddressOf Me.Child_Changed 
    End Sub

私有子OnDeserializedMethod(ByVal上下文作为StreamingContext)
AddHandler Child.Changed我的地址。Child\u已更改
端接头
但这对我来说不起作用,因为我正在使用xmlserialiser,它似乎没有通过回调实现(我读到的是与framework 1.1兼容的问题…)

相反,我使用的是我在“新”方法中测试的标志。 一切都如我所料


再次感谢@puropoix..

能否显示您的序列化和反序列化代码。他们在市中心,但我们不知道你是怎么做的。另外,NET在属性更改时也有一种标准化的实现事件的方法:
INotifyPropertyChanged
NET中的一些其他东西会寻找它来反映任何更改。我刚刚测试了INotifyPropertyChanged,得到了相同的结果。如果我在反序列化函数开始工作之前更新数据,在反序列化之后它开始工作,但在反序列化过程中,我传递了change属性子项,但没有引发事件!
        <OnDeserialized()>
Private Sub OnDeserializedMethod(ByVal Context As StreamingContext)

        AddHandler Child.Changed AddressOf Me.Child_Changed 
    End Sub