Laden...

DataGridView serialisieren - Fehler

Erstellt von Rico913 vor 3 Jahren Letzter Beitrag vor 3 Jahren 498 Views
R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren
DataGridView serialisieren - Fehler

Hallo,

ich möchte ein bestimmte Werte aus einem DatagridView (dgV_ImageList) in einem anderen DatagridView als Backup speichern.

Hier der Code:



DataGridView LoadImages_Info = new DataGridView();

private void Save_Project_Click(object sender, EventArgs e)
        {
            if (savFD_save_project.ShowDialog() == DialogResult.OK)
            {
                string SaveFile = savFD_save_project.FileName; //Filename mit Pfad
                Save_Listen_Recovery();
                Save_Messung_Daten_List(SaveFile, Liste_Recovery_Project);
            }
        }

private void Save_Listen_Recovery()
        {
            
            List<string> FileNames = new List<string>();

            foreach (DataGridViewRow row in dGV_ImageList.Rows)
            {
                FileNames.Add(dGV_ImageList.Rows[row.Index].Cells[5].Value.ToString());
                for (int i = 2; i < dGV_ImageList.Columns.Count; i++)
                {
                    LoadImages_Info.Columns.Add(i.ToString(),i.ToString());
                    LoadImages_Info.Rows.Add(dGV_ImageList.Rows[row.Index].Cells[i].Value);
                }
            }

            Liste_Recovery_Project.Add(new Liste_Recovery()
            {
                Liste_Messung_Recovery = Liste_Messung_Daten,
                FileListe_Recovery = FileNames,
                Image_DataGrid = LoadImages_Info
                
            });
        }

private void Save_Messung_Daten_List(string FilePath, List<Liste_Recovery> SaveList)
        {
            FileStream stream;
            stream = new FileStream(FilePath, FileMode.Create);
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, SaveList);
            stream.Close();
            SaveList.Clear();
        }

[Serializable]
public class Liste_Recovery
{
    public List<Liste_Messung> Liste_Messung_Recovery { get; set; }
    public List<string> FileListe_Recovery { get; set; }
    public DataGridView Image_DataGrid { get; set; }
}


Ich bekomme aber eine Exeption:> Fehlermeldung:

System.Runtime.Serialization.SerializationException: "Der Typ "System.Windows.Forms.DataGridView" in Assembly "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" ist nicht als serialisierbar gekennzeichnet."

Ich habe doch aber das DataGridView als Serializable markiert 🤔

Wenn ich das Image_DataGrid auskommentiere funktioniert es tadellos??

16.835 Beiträge seit 2008
vor 3 Jahren

Ich habe doch aber das DataGridView als Serializable markiert

Nein, Du hast Deine Klasse serialisierbar markiert; versuchst aber das Grid zu serialisieren - und das ist total Banane.

Man serialisiert die Daten; nicht die UI-Elemente. Du hast aber in Deiner Klasse UI Elemente, die da nicht rein gehören.
Und damit man eben UI-Elemente gar nicht erst versucht zu serialisieren, sind sie mit dem NonSerializedAttribute versehen, sodass genau diese Exception kommt, wenn man es trotzdem versucht.

PS: Und der BinaryFormatter ist so das ziemlich schlimmste, was man zum Serialisieren verwenden kann - und seit Jahren gibt es die Empfehlungen, genau das nicht mehr zu nutzen.
Der BinaryFormatter ist mittlerweile in der .NET Welt nur noch ein Meme => Remove BinaryFormatter from the shared framework in .NET 5

BinaryFormatter will have a disable switch soon and go away in the future. Time to start your planning.
Today the death of binaryformatter begins.

R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren

Woher wusste ich nur, dass ich in puncto BinaryFormatter solch ein Statement bekomme 😉
Ich hatte das zwar schon des öfteren gelesen, aber er funktioniert in diesem Punkt gut.

Welche Probleme können denn damit auftreten??

Danke für die kurze Erklärung zum Serialisieren. Ehrlich gesagt habe ich da nach dem Schnellschussprinzip gearbeitet. -> Such bei Google, Kopiere, funzt, keine Gedanken drüber machen.
Ich weiß, dass ist nicht die feine Art und nun bedarf es doch etwas Einarbeitung.

Viele Grüße

16.835 Beiträge seit 2008
vor 3 Jahren

Welche Probleme können denn damit auftreten??

Kannst prinzipiell selbst googeln: Google-Suche nach why binaryformatter is bad

1: Du kannst ihn bald nicht mehr verwenden, weil er rausfliegt
2: Er ist die langsamte Art zu serialisieren => O(n²)
3: Er braucht ungeheulich viel Speicher (Faktor >200 zu anderen Möglichkeiten)
4: Der BinaryFormatter ist unsicher (RCE, siehe Link oder aus der Google Trefferliste Deserialization can be dangerous)

Oder auch einfach den Link lesen, den ich Dir im Post davon extra deswegen schon gegeben hab.
Den BinaryFormatter heute noch zu verwenden ist einfach - gelinde gesagt - schrecklich dämlich (nich persönlich gemeint! ) 😉

T
2.224 Beiträge seit 2008
vor 3 Jahren

Was auch gegen den BinarySerializer spricht -> Bei Änderungen an deiner Daten Klasse kannst du die Daten nicht mehr deserialisieren.
Hier streikt der Formater dann bzw. wirft die eine entsprechende Exception, weil er fehlende/neue Properties nicht mappen kann.
Entsprechend hast du keine kompatibilität deiner Daten wenn du die Daten änderst.
Oder du musst dann z.B. direkt mit Ableitungen und Versionierungen arbeiten, was aber dann aber zusätzliche Klassen für die Kompatibilität angeht.

Wenn du deine Daten z.B. über Json.Net oder ab .NET 5 mit System.Text.Json als Json Serialisierst, dann ist das keine Problem.
Hier werden bei fehlende/neue Properties einfach nur die vorhandenen Properties gemappt.
Dadurch kannst du auch bei Änderungen deiner Daten Klassen die alten Formate lesen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.