Autor |
Beitrag |
BlackMatrix
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Sa 06.08.11 20:23
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
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Sa 06.08.11 22:22
Hallo BlackMatrix,
wie sieht denn deine Child-Klasse aus?
Nicht alle Datentypen sind standardmäßig serialisierbar, s. z.B. auch www.c-sharp-forum.de...ializer_99152,0.html
Du kannst mittels Xml-Attributen aber die Serialisierung konkret beeinflussen, s.a. Steuern der XML-Serialisierung mit Attributen
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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 msdn.microsoft.com/d...ri%28v=vs.71%29.aspx nicht dennoch serialisierbar sein?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Di 09.08.11 13:19
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 09.08.11 14:21
Ersetze DataSet einfach komplett durch eine BindingList<Child>. Databinding funktioniert nicht nur mit DataTable/Dataset.
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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.
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 09.08.11 19:46
Hallo BlackMatrix,
schau dir mal die Antworten von norman2306 unter www.c-sharp-forum.de...filtern_98790,0.html (Stichwort: BrowsableAttribute) an.
Für deine zweite Frage habe ich aber auf Anhieb keine Lösung parat.
Bei WPF meine ich, daß dort die "Eigenschaft.Untereigenschaft"-Syntax funktioniert, bei WinForms jedoch nicht.
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
|
|