Property Object von Serialisierung ausschließen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    Property Object von Serialisierung ausschließen

    Hallo.

    Ich möchte in einer Klasse ein Property von der Serialisierung (nach Byte, nicht XML) ausschließen.
    Wenn ich nun über die Property das Attribut <NonSerialized> setze geht dies nicht. Fehler: Das Atribut NonSerializedAttribute kann nicht auf <> angewendet werden, da das Attribut für diesen Deklarationstyp nicht gültig ist.
    Das Property ist vom Typ her ein UserControl.

    Wie kann ich dieses von der Serialisierung ausschließen? (Serialisieren ist ja wohl nicht möglich)

    Wenn ich es nicht ausschließe bekomme ich die Meldung:
    Der Typ "System.Windows.Controls.UserControl" in Assembly "PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=" ist nicht als serialisierbar gekennzeichnet.

    Gelöschter Benutzer schrieb:

    Fehler:
    Du hast den kommunizierenden Code nicht gepostet.
    Posta mal die ganze Klasse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich Poste mal nen Teil der Klasse:

    Das ist die Klasse die ich serialisieren möchte. (Gibt natürlich noch mehr Properties)

    Das Property "ScoreControl" möchte ich ausnehmen.

    VB.NET-Quellcode

    1. Public Class Gamer
    2. <NonSerialized>
    3. Public Property ScoreControl() As PlayerScoreControl501
    4. End Class


    Der Property Typ ist PlayerScoreControl501, was wiederum ein WPF UserControl ist.

    Hier scheitert dann die Serialisierung:

    VB.NET-Quellcode

    1. Private Function ObjectToByteArray(obj As [Object]) As Byte()
    2. If obj Is Nothing Then
    3. Return Nothing
    4. End If
    5. Dim bf As New BinaryFormatter()
    6. Dim ms As New MemoryStream()
    7. bf.Serialize(ms, obj)
    8. Return ms.ToArray()
    9. End Function


    (Bei bf.Serialize(ms, obj))
    @gegy Probier mal diese Schreibweise:

    VB.NET-Quellcode

    1. Public Class Gamer
    2. <NonSerialized>
    3. Public ScoreControl As PlayerScoreControl501
    4. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Gelöschter Benutzer schrieb:

    jedoch versucht er das Property noch immer zu serialisieren
    Wie äußert sich das?
    Ist Deine Klasse PlayerScoreControl501 als serialisierbar gekennzeichnet?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oh Moment mal. Ich glaub jetzt geht es. Muss noch was testen.

    Kannst du mir erklären wo der Unterschied zwischen:

    VB.NET-Quellcode

    1. ​Public Property ScoreControl() As PlayerScoreControl501


    und

    VB.NET-Quellcode

    1. Public ScoreControl() As PlayerScoreControl501


    Wusste nicht, dass dies eine Auswirkung auf die Attribute hat. :-O
    @gegy Die obere ist ein einzelnes Property, die untere ein Member-Array.
    Bei meinem Beispiel kamen die Klammern nicht vor:

    VB.NET-Quellcode

    1. Public ScoreControl As PlayerScoreControl501
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sorry mein Fehler. Meinte natürlich den Unterschied zwischen:

    VB.NET-Quellcode

    1. Public Property ScoreControl As PlayerScoreControl501


    und

    VB.NET-Quellcode

    1. ​Public ScoreControl As PlayerScoreControl501


    Ist das zweite denn noch immer ein Property?
    Hi
    implementiere die Property einfach:

    VB.NET-Quellcode

    1. <NonSerialized()>
    2. Private _scoreControl As PlayerScoreControl501
    3. '<XmlIgnore>
    4. Public Property ScoreControl As PlayerScoreControl501
    5. Get
    6. Return _scoreControl
    7. End Get
    8. Set(value As PlayerScoreControl501)
    9. _scoreControl = value
    10. End Set
    11. End Property

    XmlIgnore kannst du auskommentieren, sofern du den Verweis eingebunden hast.

    Viele Grüße
    ~blaze~
    Wenn's ins Objektmodell passt, kannst du die Property auch Friend anstatt Public definieren.
    Dann wird sie auch nicht serialisiert.

    Visual Basic-Quellcode

    1. ​Public Class Gamer
    2. Friend Property ScoreControl() As PlayerScoreControl501
    3. Public Property AnotherSerializableProperty As String
    4. End Class

    Den Unterschied zwischen Public und Friend solltest du kennen oder nachlesen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()