Serialisierung von Progressbar

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Serialisierung von Progressbar

    N'Abend,

    ich habe eine eigene Klasse erstellt, die als Property u.a. ein Progressbar besitzt.
    Nun würde ich gerne eine Liste, die Objekte dieser Klasse enthält, serialisieren.
    Leider kommt dann diese Fehlermeldung:
    Der Typ "System.Windows.Forms.ProgressBar" in Assembly "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" ist nicht als serialisierbar gekennzeichnet.


    Meine Klasse ist aber als
    <Serializable()>
    markiert und wenn ich das Progressbar-Property weglasse geht das Serialisieren auch.
    Kann es sein, dass ich Klassen mit Progressbars gar nicht serialisieren kann? ?( Das wäre ziemlich blöd, weil das Progressbar ist eng an diese Klasse gekoppelt.

    Danke schonmal für eure Hilfe.

    dertobis schrieb:

    Kann es sein, dass ich Klassen mit Progressbars gar nicht serialisieren kann?
    Klar geht das. Gib dieser explizit das NonSerializedAttribute. Gugst Du hier.
    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!
    Controls kann man nicht serialisieren, aber sie enthalten Daten (wie z.B. bei der Progressbar die Value-Eigenschaft), die kannst du serialisieren.
    Wäre ja total merkwürdig ein Control zu serialisieren, da sie ja tausend andere nutzlose Sachen haben und es somit Speicherverschwendung wäre.
    Deswegen sollte deine Klasse nicht eine Progressbar-Property, sondern eine Integer-Property haben, an der du dann durch Binding zugreifen kannst.

    mfg
    Compffreak

    RodFromGermany schrieb:

    Klar geht das.


    Hm, da war ich vielleicht nicht deutlich genug. Natürlich muss ich das Progressbar nach dem Deserialisieren wie im Urzustand weiterverwenden können. Das Tag bringt mir ja nur den Ausschluss den ich eben nicht will.

    compffreak schrieb:

    Deswegen sollte deine Klasse nicht eine Progressbar-Property, sondern eine Integer-Property haben,


    Doof. Das heißt also ich brauche für jegliches Property, welches ich aus dem Progressbar-Control benötige wiederum ein eigenes Property in meiner Klasse...? Mit einem Integer ist es nicht getan, da ich zB. noch Position, Größe, Typ, Value etc. benötige. Deshalb hätte ich es halt schick gefunden das gesamte Control wiederzuverwenden.
    jo - so ist das, und kann auch nicht anders sein.
    Ein Control hat ca. 40 Properties, und einige davon verweisen auf annere Controls, und die noch weiter etc. pp.. Das kann nicht alles serialisiert werden

    Und auch die Events müssten mit-serialisiert werden, denn Serialisierung will ein Objekt ja wieder so rekonstruieren, wies war.
    Ein "Speichern"-Button, der nicht speichert, ist aber nicht mehr wie er war.
    aber vermutlich ist Serialisierung nicht ganz der richtige Ansatz.
    Denn du willst keine neuen Objekte erschaffen, sondern du willst bestehende Objekte konfigurieren (etwa die darin enthaltene Progressbar).
    Deserialisierung erschafft aber neue Objekte, und dann hast du doppelte Arbeit, weil du das neue Objekt noch auslesen musst, um die gewünschten Einstellungen dann vorzunehmen.

    Vom Prinzip her täte ComplexConverter: alles in einen String und zurück hier besser passen.
    Also wenn du imstande bist, den Code as it is einzubinden, dann hast du damit evtl. ein einfacheres Mittel als eine Serialisierungs-Implementierung + Konfig-Code.

    dertobis schrieb:

    wie im Urzustand
    Merk Dir Max, Min und Value in separaten Properties, und das Control lelbst markierst Du Dir als NonSerialized().
    Übrigens lässt sich bei mir die ProgressBar problemlos serialisieren. :/
    NonSerialized ProgressBar

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class Class1
    3. <NonSerialized()>
    4. Private bar As ProgressBar
    5. Public Property Minimum As Integer
    6. Get
    7. Return bar.Minimum
    8. End Get
    9. Set(value As Integer)
    10. bar.Minimum = value
    11. End Set
    12. End Property
    13. Public Property Maximum As Integer
    14. Get
    15. Return bar.Maximum
    16. End Get
    17. Set(value As Integer)
    18. bar.Maximum = value
    19. End Set
    20. End Property
    21. Public Property Value As Integer
    22. Get
    23. Return bar.Value
    24. End Get
    25. Set(value As Integer)
    26. bar.Value = value
    27. End Set
    28. End Property
    29. Public Sub New()
    30. bar = New ProgressBar
    31. End Sub
    32. End Class
    Um das Abtesten der Bereichsgrenzen musst Du Dich selber kümmern. ;)
    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!

    ErfinderDesRades schrieb:

    KorintenKacker

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class Class2
    3. Private bar As ProgressBar
    4. Public Sub New()
    5. bar = New ProgressBar
    6. End Sub
    7. End Class
    kompiliert.
    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!
    Ja - aber verwende das mal. Ich glaube ja, da wird man sich wundern, allerspätestens, wenn man von dieser PB ein Event abonniert, und danach wieder serialisiert.

    Warum ich hier so käckerle ist, um dem TE als Einsteiger nicht die einfache Wahrheit zu erschweren, dass Controls numa nicht zu serialisieren sind.

    Aber gleichzeitig bin ich zu faul, dein Konstrukt nu wirklich zu testen, daher weiß ich nu nicht... :S

    Hast du Lust, ein Demo damit zu basteln?`

    RodFromGermany schrieb:

    KorintenKacker

    ErfinderDesRades schrieb:

    als Einsteiger

    Wenn wir schon genau sind, dann will ich darauf hinweisen, dass ich diese qualifizierende Bezeichnung nur für den Bereich dieses Themas akzeptiere. Vielleicht mag es seltsam erscheinen, aber ich bin hauptberuflich Softwareentwickler, hatte mit Serialisierung aber bisher noch nichts am Hut. :whistling:

    RodFromGermany schrieb:

    Übrigens lässt sich bei mir die ProgressBar problemlos serialisieren.

    Wirklich serialisieren? Oder nur kompilieren? Letzteres stellt ja kein Problem dar.

    ErfinderDesRades schrieb:

    Demo

    Ja, kann ich schon mal rudimentär zur Verfügung stellen.

    Meine Sub zur Serialisierung sieht jedenfalls so aus:

    VB.NET-Quellcode

    1. Public Sub SaveList()
    2. fs = New FileStream("c:\Temp\list.log", FileMode.Create)
    3. bf.Serialize(fs, fileList)
    4. fs.Close()
    5. End Sub


    Dabei enthält fileList natürlich die genannte zu serialisierende Klasse mit der Progressbar.
    nee - ich meinte Rod mit dem Demo für sein Konstrukt aus post#11.

    Er soll ein Form bauen, mit einer Pb drinne. Am besten soll ihr KeyDown-Event abonniert sein.
    Dann einen Button geben zum abspeichern dieser PB, und danach muss an der PB was geändert werden, damit man
    beim 2. Button sieht, wie diese PB mittels Deserialisierung wieder hergestellt wird.



    Du kannst natürlich auch ein Demo erstellen. Ich hab nämlich keine Ahnung, wozu man eine Klasse mit mehreren Progressbars drinne verwenden sollte.
    Imo sollte man Oberfläche und Gui immer fein auseinanderhalten, und Serialisierung sollte Daten transportabel machen, keine Oberflächen-Stücke.
    Mit Demo meine ich was lauffähiges gezippt und angehängt.
    Wenn ich dann den Sinn vons ganze verstehe, findet sich bestimmt auch ein Weg, das umzusetzen, ob nun mit Serialisierung oder anners.

    Btw - hast du mal mit dem Code aussm Link aus post#8 Experimente gemacht - macht das prinzipiell was du dir vorstellst (also das orgelt auf Treeview, Form und Listview rum - PB wäre natürlich viel einfacher)
    ?

    dertobis schrieb:

    Oder nur kompilieren?

    RodFromGermany schrieb:

    kompiliert.
    Ansonsten poste Deinen relevanten Code, hin und rück.
    Und wenn, dann bitte so:

    VB.NET-Quellcode

    1. Using fs = New IO.FileStream("c:\Temp\list.log", IO.FileMode.Create)
    2. bf.Serialize(fs, fileList)
    3. End Using

    ErfinderDesRades schrieb:

    Rod mit dem Demo
    hab ich leider keine Zeit.
    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!

    ErfinderDesRades schrieb:

    mit mehreren Progressbars drinne

    Brauche doch nur eines, von mehreren habe ich nie etwas gesagt. ?(

    ErfinderDesRades schrieb:

    und Serialisierung sollte Daten transportabel machen

    Genau das hatte ich ja vor. Mir ging es nicht um das Control an sich, sondern dessen Properties, also spezifischen Daten. Hätte es halt schön gefunden, wenn ich diese direkt aus dem Control hätte auslesen können ohne nochmals extra Properties erstellen zu müssen.

    ErfinderDesRades schrieb:

    post#8 Experimente

    Nein habe ich noch nicht. Werde ich mir mal aus reinem Interessen bei Gelegenheit ansehen, denke aber nicht, dass es in meinem aktuellen Projekt Verwendung finden wird.


    RodFromGermany schrieb:

    relevanten Code, hin und rück


    Hin steht ja schon oben.

    Und zurück:

    VB.NET-Quellcode

    1. Public Sub LoadList()
    2. Using fs = New IO.FileStream("c:\Temp\list.log", IO.FileMode.Open)
    3. If fs.Length > 0 Then
    4. fileQueue = CType(bf.Deserialize(fs), Dictionary(Of Integer, MyFile))
    5. End If
    6. End Sub





    Im Grunde ist das Thema aber wie ich schon in post#6 sagte für mich beendet, da ich mir halt nun doch Properties erstellt habe und das Progressbar zur Laufzeit anhand der Properties in der selben Klasse dynamisch generiere und dort dann halt auch halte. (wie vorgeschlagen mit NonSerializable). Danke für die interessanten Ansätze einstweilen.

    dertobis schrieb:

    Und zurück
    Da fehlt aber ein End Using. ;)
    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!