none
Serialisierung einer Klasse mit einem Event RRS feed

  • Frage

  • Hallo Leute,
    wie kann ich die untenstehende Klasse, die ein Event enthält, serialisierbar machen?
    Ich habe zwar schon einige C# Beispiele gefunden, jedoch wird in diesen das [field:NonSerialized] - Attribute verwendet, welches mir in VB nicht zur Verfügung steht.

        <Serializable>
        Public MustInherit Class INotifyPropertyChangedBindableBase
            Implements INotifyPropertyChanged
    
            <NonSerialized>
            Public Event INotifyPropertyChanged_PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    
            Public Function SetProperty(Of T)(ByRef storage As T, ByVal value As T, <CallerMemberName> ByVal Optional propertyName As String = Nothing) As Boolean
                If Object.Equals(storage, value) Then
                    Return False
                Else
                    storage = value
                    OnPropertyChanged(propertyName)
                    Return True
                End If
            End Function
    
            Public Sub OnPropertyChanged(<CallerMemberName> ByVal Optional propertyName As String = Nothing)
                RaiseEvent INotifyPropertyChanged_PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
            End Sub
    
        End Class
    Wie kann ich das in VB umsetzen?
    Vielen Dank im Voraus

    Christian Tauschek


    Mittwoch, 21. September 2022 20:22

Antworten

  • Hi Christian,
    der C#-Compiler nutzt das field Schlüsselwort für den Ausschluss des privaten Backing-Feldes. In VB.NET gibt es diese Unterstützung nicht und du musst das explizit selbst machen:

    Imports System.Runtime.CompilerServices
    ...
        <NonSerialized()> _
        Private propchanged As PropertyChangedEventHandler
    
        Public Custom Event INotifyPropertyChanged_PropertyChanged As PropertyChangedEventHandler
            <MethodImpl(MethodImplOptions.Synchronized)> _
            AddHandler(ByVal value As PropertyChangedEventHandler)
                propchanged = DirectCast([Delegate].Combine(propchanged, value), PropertyChangedEventHandler)
            End AddHandler
            <MethodImpl(MethodImplOptions.Synchronized)> _
            RemoveHandler(ByVal value As PropertyChangedEventHandler)
                propchanged = DirectCast([Delegate].Remove(propchanged, value), PropertyChangedEventHandler)
            End RemoveHandler
            RaiseEvent(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs)
                propchanged?.Invoke(sender, e)
            End RaiseEvent
        End Event


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks



    Donnerstag, 22. September 2022 08:48

Alle Antworten

  • Hallo Christian,

    was genau soll denn bei deiner Serialisierung rauskommen? Welche Art von Serialisierung willst Du anwenden?

    Und was stört dich an dem Event?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 21. September 2022 22:03
    Moderator
  • Hi Christian,
    das Attribut "NonSerialized" steht im Framework 4.8. und auch 6.0 zur Verfügung:

    OOder nutzt du eine andere Umgebung?


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Donnerstag, 22. September 2022 05:05
  • Hallo Stefan,

    ich verwende den BinaryFormatter.
    Es lässt sich zwar die Serialisierung der Objekte, welche von INotifyPropertyChangedBindableBase erben, fehlerfrei machen, jedoch funktioniert dann nach der Serialisierung NotifyPropertyChanged (die Aktualisierung der grafischen Oberfläche) nicht mehr.
    Ohne serialisieren und deserialisieren funktioniert das schon.

    Wenn ich <NonSerialized> weglasse, dann bekomme ich schon beim Serialisieren eine Fehlermeldung.

    Lt. diesem Artikel (ich glaube zumindest, dass das die Ursache ist) benötige ich dafür "field:NonSerialized]".
    Dies steht mir aber unter VB nicht zur Verfügung.

    mfg


    Christian Tauschek

    Donnerstag, 22. September 2022 05:47
  • Hallo Peter,
    danke für deine Antwort.

    Die Umgebung passt. <NonSerialized> steht mir zur Verfügung und ich verwende es auch.
    Eine genauere Beschreibung siehe meine obige Antwort an Stefan.

    mfg


    Christian Tauschek

    Donnerstag, 22. September 2022 05:49
  • Hi Christian,
    der C#-Compiler nutzt das field Schlüsselwort für den Ausschluss des privaten Backing-Feldes. In VB.NET gibt es diese Unterstützung nicht und du musst das explizit selbst machen:

    Imports System.Runtime.CompilerServices
    ...
        <NonSerialized()> _
        Private propchanged As PropertyChangedEventHandler
    
        Public Custom Event INotifyPropertyChanged_PropertyChanged As PropertyChangedEventHandler
            <MethodImpl(MethodImplOptions.Synchronized)> _
            AddHandler(ByVal value As PropertyChangedEventHandler)
                propchanged = DirectCast([Delegate].Combine(propchanged, value), PropertyChangedEventHandler)
            End AddHandler
            <MethodImpl(MethodImplOptions.Synchronized)> _
            RemoveHandler(ByVal value As PropertyChangedEventHandler)
                propchanged = DirectCast([Delegate].Remove(propchanged, value), PropertyChangedEventHandler)
            End RemoveHandler
            RaiseEvent(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs)
                propchanged?.Invoke(sender, e)
            End RaiseEvent
        End Event


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks



    Donnerstag, 22. September 2022 08:48