Autor Beitrag
Dr.Prof.Evil
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 21.12.14 23:33 
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":

ausblenden volle Höhe 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:
ausblenden volle Höhe 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:
ausblenden volle Höhe 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.EncryptAndSerializeObject<QuizKatalog> ( path, this, overwriteAccess, null );
            Evil.FileManager.SerializeObject<QuizKatalog> ( path, this, overwriteAccess );
        }

        public static QuizKatalog Load(String path, Boolean checkForNull)
        {
            //var toReturn = Evil.FileManager.DecryptAndDeserializeObject<QuizKatalog> ( path, null );
            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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 22.12.14 11: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).

Für diesen Beitrag haben gedankt: Dr.Prof.Evil
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 22.12.14 13: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.

Für diesen Beitrag haben gedankt: Dr.Prof.Evil
Dr.Prof.Evil Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 22.12.14 19:58 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

...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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 22.12.14 20:27 
user profile iconDr.Prof.Evil hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

...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)
ausblenden volle Höhe 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 );
            }
        }
    }
}