Hallo,
ich benutze die XmlSerializer Klasse von @Nofear23m um meine Klassen in XML zu serialiseren.
Leider erhalte ich einen Fehler, den ich nicht nachvollziehen kann.
Vielleicht erst kurz zum Aufbau.
Das Model Projekt ist .Net Standard 2.0
Das Context Projekt ist ebenfalls .Net Standard 2.0 und verweist auf das Model Projekt
das WPF Programm verweist auf ViewModel (.Net Frameweork) und Context.
Nun möchte ich beim Starten, den Context laden und hier knallt es dann mit dieser Fehlermeldung:
hier mal die entsprechenden Klassen dazu:
Serializer
Context
EventModel
Kann mir jemand sagen was da das Problem ist?
Danke Euch
ich benutze die XmlSerializer Klasse von @Nofear23m um meine Klassen in XML zu serialiseren.
Leider erhalte ich einen Fehler, den ich nicht nachvollziehen kann.
Vielleicht erst kurz zum Aufbau.
Das Model Projekt ist .Net Standard 2.0
Das Context Projekt ist ebenfalls .Net Standard 2.0 und verweist auf das Model Projekt
das WPF Programm verweist auf ViewModel (.Net Frameweork) und Context.
Nun möchte ich beim Starten, den Context laden und hier knallt es dann mit dieser Fehlermeldung:
XML-Quellcode
- System.Exception
- HResult=0x80131500
- Nachricht = Fehler beim Reflektieren des Typs 'de.mhoapps.Bazaar.Context.XmlContext'.
- Quelle = Bazaar.Context
- Stapelüberwachung:
- bei de.mhoapps.Bazaar.Context.XMLSerializer.DeSerialize[T](String path, T defaultInstance) in C:\Users\mhoffmann\Documents\OneDrive\MHoApps\repos\Bazaar\Context\Bazaar.Context\XMLSerializer.cs: Zeile79
- bei de.mhoapps.Bazaar.Context.BazaarXmlContext.LoadContext() in C:\Users\mhoffmann\Documents\OneDrive\MHoApps\repos\Bazaar\Context\Bazaar.Context\BazaarXmlContext.cs: Zeile86
- bei de.mhoapps.Bazaar.Context.BazaarXmlContext..ctor() in C:\Users\mhoffmann\Documents\OneDrive\MHoApps\repos\Bazaar\Context\Bazaar.Context\BazaarXmlContext.cs: Zeile16
- bei de.mhoapps.Bazaar.ViewModel.MainViewModel..ctor() in C:\Users\mhoffmann\Documents\OneDrive\MHoApps\repos\Bazaar\ViewModel\Bazaar.ViewModel\MainViewModel.cs: Zeile18
- bei de.mhoapps.Bazaar.CashRegister.MainWindow..ctor() in C:\Users\mhoffmann\Documents\OneDrive\MHoApps\repos\Bazaar\Application\Bazaar.CashRegister\MainWindow.xaml.cs: Zeile29
- Innere Ausnahme 1:
- InvalidOperationException: Fehler beim Reflektieren der Eigenschaft 'Events'.
- Innere Ausnahme 2:
- InvalidOperationException: Fehler beim Reflektieren des Typs 'de.mhoapps.Bazaar.Model.EventModel'.
- Innere Ausnahme 3:
- FileNotFoundException: Die Datei oder Assembly "System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.
hier mal die entsprechenden Klassen dazu:
C#-Quellcode
- /// <summary>
- /// ''' Der XMLSerializer serialisiert eine beliebige Klasse welche auch Primitiven Datentypen oder solchen welche als Serialisiert gekennzeichnet sind
- /// ''' Klasse ist generisch aufgebaut und gibt die selbe Type von Klasse zurück welche ihm übergeben wird.
- /// ''' </summary>
- public class XMLSerializer
- {
- /// <summary>
- /// Der XMLSerializer serialisiert eine beliebige Klasse welche auch Primitiven Datentypen oder solchen welche als Serialisiert gekennzeichnet sind
- /// Klasse ist generisch aufgebaut und gibt die selbe Type von Klasse zurück welche ihm übergeben wird.
- /// </summary>
- public void Serialize<T>(string path, T instance)
- {
- try
- {
- string dirName = Path.GetDirectoryName(path);
- if (!Directory.Exists(dirName))
- Directory.CreateDirectory(dirName);
- File.Delete(path);
- using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
- {
- SaveToStream(fs, instance);
- }
- }
- catch (Exception ex)
- {
- throw new Exception(ex.Message, ex.InnerException);
- }
- }
- /// <summary>
- /// Serialisiert eine Klasse über einen Stream
- /// </summary>
- /// <typeparam name="T">Den Klassentyp angeben</typeparam>
- /// <param name="s">Der Stream welcher die Daten enthält (Filestream, MemoryStream,...)</param>
- /// <param name="o">Die Instanz der Klasse welche serialisiert werden soll</param>
- public void SaveToStream<T>(Stream s, T o)
- {
- try
- {
- System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(T));
- x.Serialize(s, o);
- }
- catch (Exception ex)
- {
- throw new Exception(ex.Message, ex.InnerException);
- }
- }
- /// <summary>
- /// Deserialisiert eine XML in eine Klasseninstanz - Die Instanz muss also nicht erstellt sein.
- /// </summary>
- /// <typeparam name="T">Der Typ der Klasse welche erwartet wird.</typeparam>
- /// <param name="path">Der Pfad zur XML-Datei inkl. Dateiendung</param>
- /// <param name="defaultInstance">Die Instanz der Klasse falls die Datei noch nicht Existiert oder nicht gefunden werden kann</param>
- /// <returns>Gibt die Deserialissierte Klasse zurück</returns>
- public T DeSerialize<T>(string path, T defaultInstance)
- {
- try
- {
- if (!File.Exists(path))
- {
- return defaultInstance;
- }
- using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
- {
- return LoadFromStream<T>(fs);
- }
- }
- catch (Exception ex)
- {
- throw new Exception(ex.Message, ex.InnerException);
- }
- }
- /// <summary>
- /// Läd ein Klasse generisch über einen Stream, Methode ist gut geeignet für UnitTests
- /// </summary>
- /// <typeparam name="T">Der Typ der Klasse welche erwartet wird</typeparam>
- /// <param name="s">Der Stream welcher die Daten enthält (Filestream, MemoryStream,...)</param>
- /// <returns>Gibt die Deserialisierte Klasse zurück</returns>
- public T LoadFromStream<T>(Stream s)
- {
- System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(T));
- return (T)x.Deserialize(s);
- }
- }
C#-Quellcode
- public class BazaarXmlContext : ContextBase, IDisposable
- {
- private readonly string _xmlpath;
- private XmlContext CurrentContext { get; set; }
- public BazaarXmlContext()
- { _xmlpath = AppDomain.CurrentDomain.BaseDirectory + @"\BazaarData.xml";
- LoadContext();
- }
- public BazaarXmlContext(string xmlpath)
- {
- if (!Directory.Exists(Path.GetDirectoryName(xmlpath))) throw new Exception("Der Pfad zum XML-Datendateiordner existiert nicht.");
- _xmlpath = xmlpath;
- LoadContext();
- }
- internal event ErrorMessageSentEventHandler ErrorMessageSent;
- internal delegate void ErrorMessageSentEventHandler(string message);
- #region Context Properties
- public ObservableCollection<EventModel> Events => CurrentContext.Events;
- public ObservableCollection<PersonModel> Persons => CurrentContext.Persons;
- public ObservableCollection<ArticleModel> Articles => CurrentContext.Articles;
- #endregion
- #region Methods
- public void Seed()
- {
- //Organizer und Responsible anlegen
- PersonModel organizer = new PersonModel() {ID = 1, FullName = "Förderverein KiTa Kunterbunt e.v.", PersonType = PersonTypeEnum.Organizer, License = LicenseTypeEnum.Free };
- PersonModel responsible = new PersonModel() {ID = 2, FullName = "Harald Muster", Email = "harald@muster.com", PersonType = PersonTypeEnum.Responsible };
- // wenn der Responsible gleichzeitig auch Verkäufer ist, dann PersonType auf ResponsibleSeller setzen
- //PersonModel responsible = new PersonModel() { ID = 2, FullName = "Harald Muster", Email = "harald@muster.com", PersonType = PersonTypeEnum.ResponsibleSeller };
- //Events anlegen
- EventModel eventI = new EventModel() { ID = 1, EventName = "Kleiderbasar Musterhausen", EventDate = DateTime.Now.AddDays(14), OrganizerID = organizer.ID, ResponsiblePersonID = responsible.ID };
- EventModel eventII = new EventModel() { ID = 2, EventName = "Grillfeier KiTahausen", EventDate = DateTime.Now.AddDays(14), OrganizerID = organizer.ID, ResponsiblePersonID = responsible.ID };
- //Seller anlegen
- PersonModel sellerI = new PersonModel() { ID = 3, FullName = "Maria Muster", SellerNumber = 1, PersonType = PersonTypeEnum.Seller,
- PersonEvents = new List<PersonEventModel>() { new PersonEventModel() { EventId = eventI.ID } } };
- PersonModel sellerII = new PersonModel() { ID = 3, FullName = "Helga WatWeisIch", SellerNumber = 2, PersonType = PersonTypeEnum.Seller,
- PersonEvents = new List<PersonEventModel>() { new PersonEventModel() { EventId = eventII.ID } }};
- PersonModel sellerIII = new PersonModel() { ID = 3, FullName = "Irmtraut HasteNichtGesehen", SellerNumber = 3, PersonType = PersonTypeEnum.Seller,
- PersonEvents = new List<PersonEventModel>() { new PersonEventModel() { EventId = eventII.ID } }};
- if (!Persons.Any())
- {
- Persons.Add(organizer);
- Persons.Add(responsible);
- Persons.Add(sellerI);
- Persons.Add(sellerII);
- Persons.Add(sellerIII);
- }
- if (!Events.Any())
- {
- Events.Add(eventI);
- Events.Add(eventII);
- }
- if (!Articles.Any())
- {
- Articles.Add(new ArticleModel() { ArticleNumber = 123, Description = "Spiel - Schnappt Hubi", Price = 2.5m, Quantity = 1, PersonID = sellerI.ID });
- Articles.Add(new ArticleModel() { ArticleNumber = 456, Description = "türkisblaue Jacke", Price = 5, Quantity = 1, PersonID = sellerIII.ID });
- Articles.Add(new ArticleModel() { ArticleNumber = 789, Description = "bunte Hose", Price = 0.5m, Quantity = 1, PersonID = sellerII.ID });
- Articles.Add(new ArticleModel() { ArticleNumber = 1011, Description = "Häßliche Mütze", Price = 25, Quantity = 1, PersonID = sellerIII.ID });
- Articles.Add(new ArticleModel() { ArticleNumber = 1012, Description = "Jacke", Price = 2, Quantity = 1, Size = "140/146", PersonID = sellerI.ID });
- Articles.Add(new ArticleModel() { ArticleNumber = 1013, Description = "Hose", Price = 4, Quantity = 1, PersonID = sellerII.ID });
- Articles.Add(new ArticleModel() { ArticleNumber = 1014, Description = "Turnhose", Price = 1, Quantity = 2, PersonID = sellerIII.ID });
- Articles.Add(new ArticleModel() { ArticleNumber = 1015, Description = "Kaufladen mit Zubehör", Price = 25, Quantity = 1, PersonID = sellerI.ID });
- }
- SaveChanges();
- }
- internal void LoadContext()
- {
- XMLSerializer xser = new XMLSerializer();
- CurrentContext = xser.DeSerialize<XmlContext>(_xmlpath, new XmlContext());
- }
- public bool SaveChanges()
- {
- try
- {
- XMLSerializer ser = new XMLSerializer();
- ser.Serialize<XmlContext>(_xmlpath, CurrentContext);
- return true;
- }
- catch (Exception ex)
- {
- ErrorMessageSent?.Invoke(ex.Message);
- return false;
- }
- }
- #endregion
- #region IDisposable
- private bool _disposedValue;
- protected virtual void Dispose(bool disposing)
- {
- if (!_disposedValue)
- {
- if (disposing)
- {
- CurrentContext = null;
- }
- }
- _disposedValue = true;
- }
- public void Dispose()
- {
- Dispose(true);
- }
- #endregion
- }
- #region XmlContext Class
- [Serializable]
- public class XmlContext : ContextBase
- {
- public XmlContext()
- {
- Events = new ObservableCollection<EventModel>();
- Persons = new ObservableCollection<PersonModel>();
- Articles = new ObservableCollection<ArticleModel>();
- }
- private ObservableCollection<EventModel> _allEvents;
- public ObservableCollection<EventModel> Events
- {
- get { return _allEvents; }
- set { _allEvents = value; RaisePropertyChanged(); }
- }
- private ObservableCollection<PersonModel> _allPersons;
- public ObservableCollection<PersonModel> Persons
- {
- get { return _allPersons; }
- set { _allPersons = value; RaisePropertyChanged(); }
- }
- private ObservableCollection<ArticleModel> _allArticles;
- public ObservableCollection<ArticleModel> Articles
- {
- get { return _allArticles; }
- set { _allArticles = value; RaisePropertyChanged(); }
- }
- }
- #endregion
C#-Quellcode
- [Serializable]
- public class EventModel : ModelBase
- {
- public EventModel()
- {
- MaxSellerNumber = (int)LicenseTypeEnum.Free;
- }
- public EventModel(LicenseTypeEnum licenseType)
- {
- MaxSellerNumber = (int)licenseType;
- }
- [Key]
- public virtual int ID { get; set; }
- [Required(AllowEmptyStrings =false,ErrorMessage ="Die Veranstaltung muss benannt werden.")]
- public virtual string EventName { get; set; }
- [Required(ErrorMessage ="Sie müssen das Veranstaltungsdatum angeben.")]
- public DateTime EventDate { get; set; }
- //kann und darf leer sein (eventuell über Settings bool Variable auf Required setzen?
- public virtual double Provision { get; set; }
- //kann und darf leer sein (eventuell über Settings bool Variable auf Required setzen?
- public virtual decimal MinProvision { get; set; }
- //wird in der Datenbank gesetzt anhand der Lizenz (siehe LicenseTypeEnum)
- public virtual int MaxSellerNumber { get;}
- public virtual int OrganizerID { get; set; }
- public virtual PersonModel Organizer { get; set; }
- public virtual int ResponsiblePersonID { get; set; }
- public virtual PersonModel ResponsiblePerson { get; set; }
- public virtual ICollection<PersonEventModel> Sellers { get; set; }
- }
Kann mir jemand sagen was da das Problem ist?
Danke Euch
"Hier könnte Ihre Werbung stehen..."
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MichaHo“ ()