Serializacja,deserializacja, datagrid wpf

0

Witam,
chcę dodawać obiekty(auta) do datagrid. Chciałbym aby po zamknięciu programu, przy ponownym uruchomieniu, wcześniej zapisane auta były wyświetlane w datagrid, oraz dodatkowo te, które dodaję na bieżąco. Stworzyłem klasę auto:

 [Serializable]
    public class Auto
    {
        public string NrRejestracyjny { get; set; }
        public string NumerNadwozia { get; set; }
        public string Model { get; set; }
        public string Producent { get; set; }
        public string RokProdukcji { get; set; }
        public string Przebieg { get; set; }
        
    }

Auta dodane podczas działania programu elegancko wyświetlają się w datagtid(name="tabla"), ale przy ponownym uruchomieniu "nie widać ich". Problem rozwiązywałem w ten sposób, że każde nowo dodane auto miało być zapisywane do pliku .txt, który przy starcie programu miałby być otwierany, sczytane auta wrzucane do listy, a ta następnie wrzucane na datagrid.

public partial class MainWindow : Window
    {
        public ObservableCollection<Auto> Auta { get; set; }

       static FileInfo o = new FileInfo(@"C:\Users\Kuba\Desktop\C#\auta.txt");
        public MainWindow()
        {
            Auta = new ObservableCollection<Auto>();
            InitializeComponent();
            if (o.Exists)
            {
                BinaryFormatter bitFormat = new BinaryFormatter();
                Stream stream3 = new FileStream(@"C:\Users\Kuba\Desktop\C#\auta.txt", FileMode.Open, FileAccess.Read, FileShare.None);
                for (int i = 0; i < 10; i++)
                {
                    var p = bitFormat.Deserialize(stream3) as Auto;
                    if (p == null) { }
                    else
                    {
                        Auta.Add(p);
                    }
                }
                stream3.Close();
            }
            else { }
            tabela.ItemsSource = Auta;
      
        }

Funkcja zapisu i dodawania do datagrid:

  private void ok_Click(object sender, RoutedEventArgs e)
        {
           
            Auto auto = new Auto();
            auto.Model = model.Text;
            auto.NrRejestracyjny = numerr.Text;
            auto.NumerNadwozia = numern.Text;
            auto.Producent = producent.Text;
            auto.Przebieg = przebieg.Text;
            auto.RokProdukcji = rok.Text;

            Auta.Add(auto); 
 BinaryFormatter bitFormat2 = new BinaryFormatter();
            Stream stream2 = new FileStream(@"C:\Users\Kuba\Desktop\C#\auta.txt", FileMode.Append, FileAccess.Write, FileShare.None);



                bitFormat2.Serialize(stream2, auto.NrRejestracyjny);
                bitFormat2.Serialize(stream2, auto.NumerNadwozia);
                bitFormat2.Serialize(stream2, auto.Model);
                bitFormat2.Serialize(stream2, auto.Producent);
                bitFormat2.Serialize(stream2, auto.RokProdukcji);
                bitFormat2.Serialize(stream2, auto.Przebieg);

            stream2.Close();
tabela.ItemsSource = Auta;

Niestety taki sposób nie działa- nie rozumiem i nie wiem dlaczego, ale przy deserializacji sczytane auta są nullem, gdy w pliku txt normalnie są zapisane.
Bardzo proszę o pomoc czemu tak się dzieje. Jeśli ktoś ma inny pomysł na załatwienie tej sprawy chętnie posłucham :)

0

Czemu zapisujesz to do txt zamiast xml?

0

a czy ma to jakieś znaczenie w tym przypadku? okej, spróbuję zaraz do xml.

0

Powiedz jeszcze jak wygląda ten plik txt.

0

ok, do xml'a "działa w połowie", tzn. przy zapisaniu jednego auta wszystko działa tak jak należy, dodaję 2 auto, wyświetla się ono w datagrid. Jak zamknę program i włączam go ponownie wyskakuje mi błąd:
"Wywołanie konstruktora dla typu „zapis.MainWindow” zgodnego z określonymi ograniczeniami wiązania spowodowało wyjątek., numer wiersza 3, pozycja 9."
W czym jest problem?

0

Plik .txt:
˙˙˙˙ 2 ˙˙˙˙ 2 ˙˙˙˙ 2 ˙˙˙˙ 2 ˙˙˙˙ 2 ˙˙˙˙ 2 ˙˙˙˙ 1 ˙˙˙˙ 1 ˙˙˙˙ 1 ˙˙˙˙ 1 ˙˙˙˙ 1 ˙˙˙˙ 1
plik xml:

<?xml version="1.0"?> <auto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <nrrejestracyjny>z</nrrejestracyjny> <numernadwozia>z</numernadwozia> <model>z</model> <producent>z</producent> <rokprodukcji>zz</rokprodukcji> <przebieg>z</przebieg> </auto> <?xml version="1.0"?> <auto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <nrrejestracyjny>a</nrrejestracyjny> <numernadwozia>a</numernadwozia> <model>a</model> <producent>a</producent> <rokprodukcji>a</rokprodukcji> <przebieg>a</przebieg> </auto>
0

Pokaż jeszcze kod w c#

0
public partial class MainWindow : Window
    {
        public ObservableCollection<Auto> Auta { get; set; }
       static FileInfo o = new FileInfo(@"C:\Users\Kuba\Desktop\C#\auta.xml");
        public MainWindow()
        {
            Auta = new ObservableCollection<Auto>();
            InitializeComponent();

            if (o.Exists)
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Auto));
                Stream stream2 = new FileStream(@"C:\Users\Kuba\Desktop\C#\auta.xml", FileMode.Open,
                    FileAccess.Read, FileShare.None);
                //for (int i = 0; i < 10; i++)
                //  {
                var p = serializer.Deserialize(stream2) as Auto;
                Auta.Add(p);
                //}
                stream2.Close();


                tabela.ItemsSource = Auta;
            }
      
        }
        private void ok_Click(object sender, RoutedEventArgs e)
        {
           
            Auto auto = new Auto();
            auto.Model = model.Text;
            auto.NrRejestracyjny = numerr.Text;
            auto.NumerNadwozia = numern.Text;
            auto.Producent = producent.Text;
            auto.Przebieg = przebieg.Text;
            auto.RokProdukcji = rok.Text;

            Auta.Add(auto); 
        }

        private void pokaz_Click(object sender, RoutedEventArgs e)
        {
              XmlSerializer serializer = new XmlSerializer(typeof(Auto));
                Stream stream2 = new FileStream(@"C:\Users\Kuba\Desktop\C#\auta.xml", FileMode.Open,
                    FileAccess.Read, FileShare.None);
                //BinaryFormatter bitFormat = new BinaryFormatter();
                //Stream stream3 = new FileStream(@"C:\Users\Kuba\Desktop\C#\auta.txt", FileMode.Open, FileAccess.Read, FileShare.None);
  
                //for (int i = 0; i < 10; i++)
              //  {
                    var p = serializer.Deserialize(stream2) as Auto;
                   // if (p == null) { }
                  //  else
                   // {
                        Auta.Add(p);
                   // }
               // }
                stream2.Close();
            

            tabela.ItemsSource = Auta;
        }

        private void koncz_Click(object sender, RoutedEventArgs e)
        {

            XmlSerializer serializer = new XmlSerializer(typeof(Auto));
            Stream stream2 = new FileStream(@"C:\Users\Kuba\Desktop\C#\auta.xml", FileMode.Create,
                FileAccess.Write, FileShare.None);
            foreach (var item in Auta)
            {
                serializer.Serialize(stream2, item);
           
            }
            stream2.Close();


            //BinaryFormatter bitFormat2 = new BinaryFormatter();
            //Stream stream2 = new FileStream(@"C:\Users\Kuba\Desktop\C#\auta.txt", FileMode.Append, FileAccess.Write, FileShare.None);

            //foreach (var item in Auta)
            //{


            //    bitFormat2.Serialize(stream2, item.NrRejestracyjny);
            //    bitFormat2.Serialize(stream2, item.NumerNadwozia);
            //    bitFormat2.Serialize(stream2, item.Model);
            //    bitFormat2.Serialize(stream2, item.Producent);
            //    bitFormat2.Serialize(stream2, item.RokProdukcji);
            //    bitFormat2.Serialize(stream2, item.Przebieg);

            //}
            //stream2.Close();
        }
    }

Mam nadzieję, że wszystko jest jasne. Oddzieliłem sobie 2 buttonami samo dodanie auta i jego zapis do pliku oraz wyświetleni całej zawartości(przy wyświetlaniu całej zawartości powinienem jeszcze wyczyścić datagrid,ale to szczegół).

1

Deserializacja:

            XmlSerializer deserializer = new XmlSerializer(typeof(ObservableCollection<Auto>));
            Stream stream2 = new FileStream(@"auta.xml", FileMode.Open,
                FileAccess.Read, FileShare.None);
            Auta = (ObservableCollection<Auto>)deserializer.Deserialize(stream2);
            stream2.Close();

Serializacja:

            XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<Auto>));
            Stream stream2 = new FileStream(@"auta.xml", FileMode.Create,
                FileAccess.Write, FileShare.None);
            serializer.Serialize(stream2, Auta);
            stream2.Close();
0

Okej, działa! @dam1an bardzo dziękuję! Życzę miłego weekendu :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1