Entwickler-Ecke
IO, XML und Registry - Fehler beim Reflektieren des Typs...
BlackMatrix - Sa 06.08.11 20:23
Titel: Fehler beim Reflektieren des Typs...
Ich bekomme die Fehlermeldung
Zitat: |
Fehler beim Reflektieren des Typs... |
wenn ich folgenden Code ausführe:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Child child = new Child (); XmlWriterSettings xws = new XmlWriterSettings(); xws.Indent = true; xws.IndentChars = " "; XmlWriter xw = XmlWriter.Create("test.xml", xws); XmlSerializer xs = new XmlSerializer(typeof(Child)); xs.Serialize(xw, child); xw.Close(); |
Das Anlegen eines Standardkonstruktor für Eltern und Kindklasse führt auch zu keinem anderem Ergebnis.
MfG
BlackMatrix - Sa 06.08.11 22:42
In der Kindklasse ist nichts weiter drin, als überschriebene protected Methoden der abstrakten Klasse.
Ich denke bald eher, dass es mit der Elternklasse zusammenhängt. Hat er vielleicht ein Problem mit den public Delegates oder Events?
Th69 - So 07.08.11 09:18
Hallo BlackMatrix,
ja, es könnte sein, daß Events nichts serialisiert werden können.
Probiere mal die Events mit [XmlIgnore] als Attribute auszustatten.
Ansonsten einfach selber mal solange die "public" Felder und Eigenschaften auskommentieren, bis die Klasse sich serialisieren läßt.
BlackMatrix - So 07.08.11 13:54
Jetzt weiß ich, was er nicht serialisieren kann.
Ich habe in der Klasse eine URI Property. Die ist aber wichtig, wie bekomme ich die auch abgespeichert?
Ralf Jansen - So 07.08.11 14:09
Ich wüsste jetzt nicht was in einer Uri Klasse schlimmes drin stecken könnte das das nicht serialisierbar sein sollte. Aber sollte es tatsächlich nicht gehen könntest du die Uri einfach über eine 'Ersatz'-Property als string serialisieren.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| [XmlIgnore] public Uri Uri {get;set;}
[XmlAttribute("Uri")] public string UriString { get {return (Uri == null) ? String.Empty : Uri.ToString();} set {Uri = (String.IsNullOrEmpty(value)) ? null : new Uri(value);} } |
BlackMatrix - So 07.08.11 14:33
Ralf Jansen hat folgendes geschrieben : |
Ich wüsste jetzt nicht was in einer Uri Klasse schlimmes drin stecken könnte das das nicht serialisierbar sein sollte. Aber sollte es tatsächlich nicht gehen könntest du die Uri einfach über eine 'Ersatz'-Property als string serialisieren. |
Das frage ich mich auch, aber folgendes funktioniert nicht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public abstract class Parent { public Uri Uri { get; set; } } public class Child : Parent { } |
C#-Quelltext
1: 2: 3: 4:
| Child test = new Child (); test.Uri = new Uri("http://www.c-sharp-forum.de/"); XmlWriter xw = XmlWriter.Create("test.xml"); XmlSerializer xs = new XmlSerializer(typeof(Child)); |
Danke für deinen Code.
P.S: Müsste die Uri Klasse laut
http://msdn.microsoft.com/de-de/library/system.uri%28v=vs.71%29.aspx nicht dennoch serialisierbar sein?
Kha - So 07.08.11 17:45
SerializableAttribute bezieht sich nicht auf den XmlSerializer. Du könntest es auch einmal mit dem DataContractSerializer probieren, der sollte afaik dem XmlSerializer mitterweile sowieso vorgezogen werden.
Th69 - So 07.08.11 17:52
Hallo BlackMatrix,
wie du ja in deinem Eingangsbeitrag schon festgestellt hast, müssen Klassen einen Standardkonstruktor (d.h. ohne Parameter) bereitstellen, um mittels der XmlSerializer-Klasse serialisiert werden zu können. Und die Uri-Klasse bietet keinen parameterlosen Konstruktor an - daher hilft nur der Trick, den Ralf Jansen gepostet hat.
BlackMatrix - So 07.08.11 17:58
Was mir gerade auffällt, ich möchte ja meine Daten, die im DGV gemacht werden abspeichern und beim Neustart sollen die Daten wieder eingelesen werden.
Mir stellt sich gerade die Frage, ob es denn überhaupt einen Sinn ergibt, die Daten zu serialisieren, weil am Ende muss ich ja die Daten sowieso in ein DataSet/DataTable packen und diese kann ich ja ganz bequem mit der Methode WriteXML auf der Festplatte abspeichern.
Das Binden der Properties an die Objekte hat mir aber sehr gefallen, da ich bisher die Zuweisung über die Zelleninhalte der DataTable mache:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| foreach(DataRow row in DataTable["data"]) { Child child = new Child(); child.Uri= row["uri"].ToString(); child.Path = row["path"].ToString(); [...] } |
Optimalerer Lösungsansatz?
Kha - So 07.08.11 18:10
Wozu brauchst du noch die DataTable? Ich habe mit Winforms lange nichts mehr gemacht, aber auch da sollte es leicht möglich sein, direkt eine Collection deiner Business-Objekte an das DGV zu binden.
Th69 hat folgendes geschrieben : |
Und die Uri-Klasse bietet keinen parameterlosen Konstruktor an |
Ah, ist mir gar nicht aufgefallen. Der DataContractSerializer sollte es aber trotzdem schaffen.
BlackMatrix - Di 09.08.11 13:19
Kha hat folgendes geschrieben : |
Wozu brauchst du noch die DataTable? Ich habe mit Winforms lange nichts mehr gemacht, aber auch da sollte es leicht möglich sein, direkt eine Collection deiner Business-Objekte an das DGV zu binden. |
Die DataTable habe ich doch an das DGV gebunden und die DataTable lese ich in Form_Load aus.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private void MainForm_Load(object sender, EventArgs e) { DataSet = new DataSet(); BindingSource = new BindingSource();
if (File.Exists(_xmlPath)) DataSet.ReadXml(_xmlPath); else CreateTable();
BindingSource.DataSource = DataSet.Tables["data"]; dataGridView1.DataSource = BindingSource; } |
Gerne möchte ich das besser schreiben.
Ralf Jansen - Di 09.08.11 14:21
Ersetze DataSet einfach komplett durch eine BindingList<Child>. Databinding funktioniert nicht nur mit DataTable/Dataset.
BlackMatrix - Di 09.08.11 19:37
Ralf Jansen hat folgendes geschrieben : |
Ersetze DataSet einfach komplett durch eine BindingList<Child>. Databinding funktioniert nicht nur mit DataTable/Dataset. |
Ui das ist ja nicht schlecht.
Kann man das nun auch noch ein wenig anpassen? Zum Beispiel sollen einige Properties nicht im DGV angezeigt werden. Außerdem befinden sich in meiner Klasse eine Property, die eine weitere Klasse darstellt. Nun möchte ich gerne, dass aus dieser Klasse die Properties im DGV angzeigt werden.
BlackMatrix - Mi 10.08.11 00:16
Danke für den Tipp TH69.
Wie erreicht man dann überhaupt, dass die Daten in einer .xml auf der HDD gespeichert werden?
Hinzu kommt auch noch, dass ich einen Unique Key bestehend aus 3 Werten haben möchte. Sollte ich dann vielleicht doch wieder besser zum DataSet zurückgreifen? Denn zu WPF möchte ich erstmal nicht umschwenken.
LG BlackMatrix
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!