• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Serializacja i deserializacja

42 Warsaw Coding Academy
0 głosów
180 wizyt
pytanie zadane 25 maja 2024 w C# przez lukas1231233 Nowicjusz (240 p.)

Błąd polega na tym, że zapisuje mi pustą tablicę: 

saveFileDialog1.Filter = "txt Files|*.txt|All Files|*.*";
if (MessageBox.Show("Czy chcesz zapisać wszystkie dane?",
   "Zamykanie", MessageBoxButtons.YesNoCancel) == DialogResult.Yes)
{
    try
    {
        saveFileDialog1.ShowDialog();
        foreach (Pracownik pracownik in Pracownik.Pracownicy)
        {
            using (StreamWriter fs = new StreamWriter(saveFileDialog1.FileName))
            {
                fs.Write(JsonSerializer.Serialize(pracownik));
               
            }
        }
    }

A tutaj jest błąd deserializacji:   

    Pracownik.PrepareDGV(dataGridView1);
    refresh();
    if (MessageBox.Show("Czy chcesz załadować istniejące już dane?", "Ładowanie",
       MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        try
        {
            openFileDialog1.ShowDialog();
            using (FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open))
            {
                List<Pracownik> pracownik = JsonSerializer.Deserialize<List<Pracownik>>(fs);
            }
            refresh();
        }
        catch (FileNotFoundException ex)
        {
            MessageBox.Show("Nie znaleziono pliku: " + ex.Message, "Błąd ładowania",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (JsonException ex)
        {
            MessageBox.Show("Błąd deserializacji danych: " + ex.Message,
            "Błąd ładowania", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Wystąpił nieoczekiwany błąd: " + ex.Message,
            "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}
void refresh()
{
    dataGridView1.Rows.Clear();

    foreach (Pracownik p in Pracownik.Pracownicy)
    {
        int index = dataGridView1.Rows.Add(p.tbl);
        dataGridView1.Rows[index].Tag = p;
    }




}

Proszę o szybką odpowiedź

2 odpowiedzi

0 głosów
odpowiedź 25 maja 2024 przez Karol Belka Obywatel (1,140 p.)
napisz "wydrukuj describe" sprawdź check co jest w danych zmiennej pracownik
0 głosów
odpowiedź 25 maja 2024 przez Wiciorny Ekspert (280,970 p.)

Zasadniczo jest kilka problemów,
- Otwierasz nowy StreamWriter dla każdego obiektu Pracownik, co powoduje nadpisywanie pliku. Powinieneś otworzyć StreamWriter raz, zapisać wszystkie dane, a następnie go zamknąć.

Przy deserializacji spróbuj - mapować to co zwracasz do obiektu  deserializując listę Pracownik, i przypisująć ją do Pracownik.Pracownicy, bo aktualnie nie przypisujesz. 

Uzywaj logów podczas serializacji aby sprawdzić aktualny stan obiektów.

 

saveFileDialog1.Filter = "txt Files|*.txt|All Files|*.*";
if (MessageBox.Show("Czy chcesz zapisać wszystkie dane?", "Zamykanie", MessageBoxButtons.YesNoCancel) == DialogResult.Yes)
{
    try
    {
        saveFileDialog1.ShowDialog();
        if (!string.IsNullOrEmpty(saveFileDialog1.FileName))
        {
            using (StreamWriter fs = new StreamWriter(saveFileDialog1.FileName))
            {
                fs.Write(JsonSerializer.Serialize(Pracownik.Pracownicy));
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Wystąpił nieoczekiwany błąd podczas zapisywania: " + ex.Message, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Pracownik.PrepareDGV(dataGridView1);
refresh();

if (MessageBox.Show("Czy chcesz załadować istniejące już dane?", "Ładowanie", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
    try
    {
        openFileDialog1.ShowDialog();
        if (!string.IsNullOrEmpty(openFileDialog1.FileName))
        {
            using (FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open))
            {
                Pracownik.Pracownicy = JsonSerializer.Deserialize<List<Pracownik>>(fs);
            }
            refresh();
        }
    }
    catch (FileNotFoundException ex)
    {
        MessageBox.Show("Nie znaleziono pliku: " + ex.Message, "Błąd ładowania", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    catch (JsonException ex)
    {
        MessageBox.Show("Błąd deserializacji danych: " + ex.Message, "Błąd ładowania", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Wystąpił nieoczekiwany błąd: " + ex.Message, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

void refresh()
{
    dataGridView1.Rows.Clear();

    foreach (Pracownik p in Pracownik.Pracownicy)
    {
        int index = dataGridView1.Rows.Add(p.tbl);
        dataGridView1.Rows[index].Tag = p;
    }
}

 

Podobne pytania

0 głosów
2 odpowiedzi 1,005 wizyt
pytanie zadane 25 grudnia 2015 w Java przez pulpet112 Użytkownik (760 p.)
0 głosów
0 odpowiedzi 181 wizyt
pytanie zadane 30 stycznia 2018 w C# przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
0 głosów
1 odpowiedź 1,165 wizyt
pytanie zadane 11 stycznia 2020 w C# przez assassin Gaduła (3,260 p.)

93,389 zapytań

142,385 odpowiedzi

322,547 komentarzy

62,749 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...