vb.netserializationraiseevent

RaiseEvent didn't raise when called by Deserialized function in vb.net


i have a serializable class

<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

In a module i declare my variable as class and implement my raise function

     Public WithEvents MesuresVal As New MesuresVar
Public Sub SaccVarChanged(ByVal Val, ByVal Old_Value, DictKeyDesc) Handles SaccData.VariableChanged
        For Each item As CtrlItem In SaccData.DicOfControl(DictKeyDesc)

        Dim pinstance As PropertyInfo = item.Ctrl.GetType.GetProperty(item.prop)
        pinstance.SetValue(item.Ctrl, Val)
    Next End Sub

In the code when i do

SaccData.ConsigneCompression = 1234

it call SaccVarChanged

but when i call my subroutines that Deserialize my class it pass on the RaiseEvent VariableChanged part of the code in my "public property". But it didn't raise the SaccVarChanged sub.

Is there anything i can do for that? Thank you

EDIT : here is my serialize /deserialize code :

  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

Solution

  • Ok i finally get it working...

    thanks to here : Events not working with after Deserialization

    i found that Deserialization remove the handler of the event. It seems that deserialization create a new instance of my object. The solution give in the link is something like :

            <OnDeserialized()>
    Private Sub OnDeserializedMethod(ByVal Context As StreamingContext)
    
            AddHandler Child.Changed AddressOf Me.Child_Changed 
        End Sub
    

    But that didn't work for me as i am using xmlserialiser wich seems not implement with call back (a question of compatibility with framework 1.1 i read...)

    Instead i am using a flag that i test in my "new" method. everything is working as i expect.

    Thanks once again @plutonix..