Laden...

XML Serialisieren von Objekten

Erstellt von Yukari_eX vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.880 Views
Y
Yukari_eX Themenstarter:in
2 Beiträge seit 2014
vor 9 Jahren
XML Serialisieren von Objekten

Hallo,

ich tüftel hier schon länger an diesem WPF programm
ich habe auch schon das forum nach ähnlichen problemen durchforstet, sowie das internet, aber ich finde einfach keine lösung dafür...
und zwar habe ich ein programm erstellt mit dem man einheiten erstellen und diese dann in die entsprechende SI-Einheit umgewandeln kann
nun will ich aber dass dieses programm auch die eingegebenen einheiten speichert und jederzeit wieder aufrufen kann

das ist mein (verkürzter) code:
Ps: "(....)" steht für rausgenommenen inhalt


(......)
using System.IO;
using System.Collections;
using System.Xml.Serialization;
using System.Xml;

 public partial class MainWindow : Window
    {
        List<Einheit> list = new List<Einheit>();

        public MainWindow()
        {
            InitializeComponent();
            ConvertToComboBox.ItemsSource = list;
            Unit2ComboBox.ItemsSource = list;

            Einheit Kelvin= new Einheit { Name = "Kelvin", Faktor = 1};
            (..........)
            list.Add(Kelvin);
            (..........)
            NewUnitListBox.ItemsSource = list;
        }

        private void SaveNewUnit(string filename)
        {
            System.Xml.Serialization.XmlSerializer writer =
            new System.Xml.Serialization.XmlSerializer(typeof(List<Einheit>));
            System.IO.StreamWriter file = new System.IO.StreamWriter(
            @"c:\users\kotori\documents\visual studio 2013\projects\wpfapplication2\wpfapplication2\xmlfile1.xml");
            writer.Serialize(file, list);
            file.Close();
        }

        private void ConvertButton_Click(object sender, RoutedEventArgs e)
        {(...........)}

        private void CreateUnitButton_Click(object sender, RoutedEventArgs e)
        {
                Einheit neue = new Einheit
                {
                    Name = NewUnit.Text,
                    Faktor = Convert.ToDouble(RelationToUnit.Text),
                    Referenz = (Einheit)Unit2ComboBox.SelectedItem
                };

                list.Add(neue);
                SaveNewUnit(@"C:\Users\Kotori\Documents\Visual Studio 2013\Projects\WpfApplication2\WpfApplication2\XMLFile1.xml");
           
        }
    }

mit dieser Klasse:

class Einheit
    {
        private string _name;
        private double _faktor;
        private Einheit _referenz;

        public string Name
        {
            get       {        return _name;       }
            set       {         _name = value;    }
        }

        public double Faktor
        {
            get        {         return _faktor;        }
            set        {         _faktor = value;      }
        }

        public Einheit Referenz
        {
            get        {         return _referenz;     }
            set        {         _referenz = value;   }
        }        
    }

so wie es jetzt ist wirft es mir bei der methode SaveNewUnit folgenden fehler aus:> Fehlermeldung:

Ein Ausnahmefehler des Typs "System.InvalidOperationException" ist in System.Xml.dll aufgetreten.

Zusätzliche Informationen: Auf 'WpfApplication2.Einheit' kann aufgrund der Sicherheitsebene nicht zugegriffen werden. Nur öffentliche Typen können verarbeitet werden.

ich hab es auch schon versucht alles mögliche auf public zu setzten, doch der fehler bleibt erhalten...
hoffe ihr könnt mir weiterhelfen

5.658 Beiträge seit 2006
vor 9 Jahren

Hi Yukari_eX,

deine Klasse Einheit ist ohne Zugriffsmodifizierer und daher als internal deklariert.

Christian

Weeks of programming can save you hours of planning

Y
Yukari_eX Themenstarter:in
2 Beiträge seit 2014
vor 9 Jahren

danke für deine antwort. hat super funktioniert!

nun hab ich das programm soweit fertiggestellt.
ich hab nun beim serializer und beim deserializer meinen XMLdateipfad angegeben, aber möchte gernen einen universellen pfad haben
hab auch schon nach xml pfad variable gesucht aber nichts hat funktioniert....
_
wie erstelle ich denn einen relativen pfad?_

hier nochmal mein serializer- // deserializer- code

XmlSerializer reader = new XmlSerializer(typeof(List<Einheit>));
            StreamReader file = new StreamReader(@"C:\...\...\...\Projects\Übung2\WpfApplication2\XMLFile1.xml");
            list = (List<Einheit>)reader.Deserialize(file);
XmlSerializer writer = new XmlSerializer(typeof(List<Einheit>));
            StreamWriter file = new StreamWriter(@"C:\...\...\...\Projects\Übung2\WpfApplication2\XMLFile1.xml");
            writer.Serialize(file, list);
            file.Close();
D
233 Beiträge seit 2008
vor 9 Jahren

Mit Environment.CurrentDirectory beispielsweise kannst du den aktuellen Arbeitspfad abrufen, mit Application.StartupPath den Pfad der Exe und mit System.IO.Path.Combine kannst du einen Pfad zusammensetzen.