Entwickler-Ecke
Sonstiges (.NET) - Problem mit dem Serialisieren einer Klasse
Dr.Prof.Evil - So 21.12.14 22:33
Titel: Problem mit dem Serialisieren einer Klasse
Hallo erstmal,
ich habe ein Problem mit dem Serialisieren. Und zwar programmiere ich gerade ein Quiz für die Schule.
Ich habe folgende Klassen die für mein Problem nötig sind zu erwähnen:
QuizKatalog
--
ObservableCollection<FragenKatalog>
----
ObservableCollection<Frage>
----
String QuizName
Übrigens, ich programmiere in .Net 4.5.1.! Es gab nur 4.5 zum auswählen für dieses Thread!
Im folgenden Code, sieht man die Klasse "Fragebogen":
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace SchoolQuizer.Klassen.Quiz.FragenTypen { [Serializable] public class FragenKatalog : ObservableCollection<Frage> { public FragenKatalog() : base() {
}
private String quizName; public String QuizName { get { return this.quizName; } set { this.quizName = value; } }
} } |
Mein Problem ist nun, dass der Inhalt in der ObservableCollection zwar serialisiert wird, aber die Eigenschaft "QuizName" nicht.
Der nächste Code ist die Klasse Frage:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization;
namespace SchoolQuizer.Klassen.Quiz.FragenTypen { [Serializable] public class Frage : Evil.Logix.BindableBase { public enum RightAnswerPossibilities { Antwort1, Antwort2, Antwort3, Antwort4 };
public enum QuestionTypes { MultipleChoice };
public Frage() : base() {
}
private QuestionTypes questionType; public QuestionTypes QuestionType { get { return this.questionType; } set { this.SetProperty ( ref this.questionType, value ); } }
private String question; public String Question { get { return this.question; } set { this.SetProperty ( ref this.question, value ); } }
private String antwort1; public String Antwort1 { get { return this.antwort1; } set { this.SetProperty ( ref this.antwort1, value ); } }
private String antwort2; public String Antwort2 { get { return this.antwort2; } set { this.SetProperty ( ref this.antwort2, value ); } }
private String antwort3; public String Antwort3 { get { return this.antwort3; } set { this.SetProperty ( ref this.antwort3, value ); } }
private String antwort4; public String Antwort4 { get { return this.antwort4; } set { this.SetProperty ( ref this.antwort4, value ); } }
private RightAnswerPossibilities rightAnswer; public RightAnswerPossibilities RightAnswer { get { return this.rightAnswer; } set { this.SetProperty ( ref this.rightAnswer, value ); } }
private String pathToPicture; public String PathToPicture { get { return this.pathToPicture; } set { this.SetProperty ( ref this.pathToPicture, value ); } }
public Boolean IsAnswer1 { get { if ( rightAnswer == RightAnswerPossibilities.Antwort1 ) return true;
return false; } set { if ( (Boolean) value == true ) { this.IsAnswer2 = false; this.IsAnswer3 = false; this.IsAnswer4 = false;
this.SetProperty ( ref this.rightAnswer, RightAnswerPossibilities.Antwort1 ); } } }
public Boolean IsAnswer2 { get { if ( rightAnswer == RightAnswerPossibilities.Antwort2 ) return true;
return false; } set { if ( (Boolean) value == true ) { this.IsAnswer1 = false; this.IsAnswer3 = false; this.IsAnswer4 = false;
this.SetProperty ( ref this.rightAnswer, RightAnswerPossibilities.Antwort2 ); } } }
public Boolean IsAnswer3 { get { if ( rightAnswer == RightAnswerPossibilities.Antwort3 ) return true;
return false; } set { if ( (Boolean) value == true ) { this.IsAnswer1 = false; this.IsAnswer2 = false; this.IsAnswer4 = false;
this.SetProperty ( ref this.rightAnswer, RightAnswerPossibilities.Antwort3 ); } } }
public Boolean IsAnswer4 { get { if ( rightAnswer == RightAnswerPossibilities.Antwort4 ) return true;
return false; } set { if ( (Boolean) value == true ) { this.IsAnswer1 = false; this.IsAnswer2 = false; this.IsAnswer3 = false;
this.SetProperty ( ref this.rightAnswer, RightAnswerPossibilities.Antwort4 ); } } }
} } |
Und der Code ist der QuizKatalog:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| using SchoolQuizer.Klassen.Quiz.FragenTypen; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace SchoolQuizer.Klassen.Quiz { [Serializable] public class QuizKatalog : ObservableCollection<FragenKatalog> { public QuizKatalog() : base() {
}
public void Save(String path, Boolean overwriteAccess = false) { Evil.FileManager.SerializeObject<QuizKatalog> ( path, this, overwriteAccess ); }
public static QuizKatalog Load(String path, Boolean checkForNull) { var toReturn = Evil.FileManager.DeserializeObject<QuizKatalog> ( path );
if ( toReturn == null && checkForNull == true ) return new QuizKatalog (); return toReturn; } } } |
Ich bitte euch nix verändern zu wollen oder mir auf zu zwengen, außer sie sind nötig. Und wenn, dann bitte mit Erklärung.
Der letzte Code ist die Methode zum serialiseren der Klasse:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| public static void SerializeObject<MyObjectInstanz> ( String path, MyObjectInstanz obj, Boolean overwrite = false ) { if(overwrite == true) { try { FileManager.DeleteFile ( path, true ); } catch (Exception e) { Console.WriteLine ( e.Message ); } }
using ( FileStream stream = new FileStream ( path, FileMode.Create, FileAccess.Write ) ) { try { XmlSerializer s = new XmlSerializer ( typeof ( MyObjectInstanz ) ); s.Serialize ( stream, obj ); } catch ( Exception e ) { Console.WriteLine ( e.Message ); } } } |
Wenn ihr noch mehr Code braucht, schreibts mir!
Danke im voraus!
lg
Dr. Prof. Evil
Th69 - Mo 22.12.14 10:15
Hallo und :welcome:
hast du mal probiert, nur ein Objekt der Klasse FragenKatalog zu serialisieren? Wird dann die Eigenschaft QuizName serialisiert?
Ich bin mir nicht sicher, ob es so eine gute Idee ist, von ObservableCollection zu erben (anstatt als Member der Klasse). Evtl. wird vom XmlSerializer erkannt, daß es sich um eine ObservableCollection handelt, und die weiteren Eigenschaften nicht mit serialisiert.
PS: (zur Info) Das Attribute [Serializable] wird nur vom BinarySerializer genutzt (nicht vom XmlSerializer).
Ralf Jansen - Mo 22.12.14 12:20
Der XmlSerializer hat eine Sonderbehandlung für IList Abkömmlinge und serialisiert nur die Listenelemente.
Entweder IXmlSerializable vollständig selbst implementieren oder FragenKatalog nicht von ObservableCollection<Frage> ableiten sondern die ObservableCollection<Frage> als Property des Fragenkatalogs darstellen.
Dr.Prof.Evil - Mo 22.12.14 18:58
Ralf Jansen hat folgendes geschrieben : |
...oder FragenKatalog nicht von ObservableCollection<Frage> ableiten sondern die ObservableCollection<Frage> als Property des Fragenkatalogs darstellen. |
Okay, werde den Code mal umstricken.
Danke vorerst. :)
lg
Dr. Prof. Evil oder Tom
Dr.Prof.Evil - Mo 22.12.14 19:27
Dr.Prof.Evil hat folgendes geschrieben : |
Ralf Jansen hat folgendes geschrieben : |
...oder FragenKatalog nicht von ObservableCollection<Frage> ableiten sondern die ObservableCollection<Frage> als Property des Fragenkatalogs darstellen. |
Okay, werde den Code mal umstricken. |
Hat funktioniert :). Danke
Neuer Code: (FragenKatalog)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace SchoolQuizer.Klassen.Quiz.FragenTypen { [Serializable] public class FragenKatalog : Evil.Logix.BindableBase { public FragenKatalog() : base() {
}
private String quizName; public String QuizName { get { return this.quizName; } set { this.SetProperty ( ref this.quizName, value ); } }
private ObservableCollection<Frage> fragenList; public ObservableCollection<Frage> FragenList { get { return this.fragenList; } set { this.SetProperty ( ref this.fragenList, value ); } } } } |
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!