0

私はシリアライズ可能なクラスを持っています

<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

モジュールで、変数をクラスとして宣言し、レイズ関数を実装します

     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

私がするときのコードで

SaccData.ConsigneCompression = 1234

SaccVarChanged を呼び出します

しかし、クラスをデシリアライズするサブルーチンを呼び出すと、コードの RaiseEvent VariableChanged 部分が「パブリック プロパティ」に渡されます。しかし、それは SaccVarChanged サブを発生させませんでした。

そのために私にできることはありますか?ありがとうございました

編集:ここに私のシリアル化/逆シリアル化コードがあります:

  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
4

1 に答える 1

0

わかりました、ようやく機能します...

ここに感謝します:デシリアライゼーション後にイベントが機能しない

私は、デシリアライゼーションがイベントのハンドラーを削除することを発見しました。逆シリアル化により、オブジェクトの新しいインスタンスが作成されるようです。リンクにある解決策は次のようなものです:

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

        AddHandler Child.Changed AddressOf Me.Child_Changed 
    End Sub

しかし、コールバックを実装していないように見えるxmlserialiserを使用しているため、それはうまくいきませんでした(私が読んだフレームワーク1.1との互換性の問題...)

代わりに、「新しい」メソッドでテストするフラグを使用しています。すべてが期待どおりに機能しています。

もう一度ありがとう@plutonix ..

于 2015-11-30T12:31:15.937 に答える