Forum: PC-Programmierung c#: <this> ist schreibgeschützt


von Matthias S. (da_user)


Lesenswert?

Tag,

ich möchte in einer XML-Datei meine Konfiguration für mein Progrämmchen 
speichern. Dazu habe ich mir eine Klasse angelegt und in dieser die 
beiden Methoden zum serialisern und deserialisieren der Klasse:
1
 public class Konfig
2
    {
3
        public Konfig() { }
4
5
        /// <summary>
6
        /// Konfiguration in config.xml speichern
7
        /// </summary>
8
        public void SaveConfig()
9
        {
10
            FileStream stream = new FileStream(Application.StartupPath + @"\config.xml", FileMode.Create);
11
            XmlSerializer serializer = new XmlSerializer(typeof(Konfig));
12
            serializer.Serialize(stream, this);
13
        }
14
15
16
        /// <summary>
17
        /// Konfiguration aus config.xml lesen
18
        /// </summary>
19
        public void LoadConfig()
20
        {
21
            FileStream stream = new FileStream(Application.StartupPath + @"\config.xml", FileMode.Open);
22
            XmlSerializer deserializer = new XmlSerializer(typeof(Konfig));
23
            this = (Konfig)deserializer.Deserialize(stream);
24
        }
25
26
// Die ganzen Variablen und das gesocks

Jetzt bekomme ich den Compilerfehler "Die Zuordnung zu "<this>" ist 
nicht möglich, da das Element schreibgeschützt ist.

Ist ja klar, dass sich die Methode nicht selbst überschreiben lassen 
möchte. Könnte ich das ganze irgendwie so umgehen, dass die beiden 
Methoden innerhalb der Klasse bleiben, oder muss ich die nach extern 
auslagern?

VG
Matthias

von Peter II (Gast)


Lesenswert?

Matthias S. schrieb:
> Methoden innerhalb der Klasse bleiben, oder muss ich die nach extern
> auslagern?

du kannst du methode als static machen.

static public Konfig LoadConfig() {
   return (Konfig)deserializer.Deserialize(stream);
}

Und dann kannst du doch einfach

Konfig k = Konfig.LoadConfig();

machen.

von Wlan_ist_nicht_so_schlecht (Gast)


Lesenswert?

Wenn du serialisierst und de serialisierst empfehle ich dir eine 
factrory klasse zu machen, die dir deine Objekte erstellt oder 
speichert.
Oder wie mein Vorredner schon sagte eine statische Methode die dir ein 
Objekt erzeugt. du musst dich allerdings fragen warum du überhaupt 
serialisierst und wie viele Objekte du überhaupt hast während deines 
Programmzyklus.

Wenn du nur ein Objekt hast oder jedes objekt in eine eigene Datei 
schreibst kannst du das so machen. Ansonsten brauchst du ja auch einen 
Dateinamen, dann musst du die save-Methode aber auch wieder statisch 
machen und dann musst du  für jedes Objekt einen Eintrag in einer liste 
haben damit du sie wieder erzeugen kannst...

Also speicherst du gleich ein Array von Objekten. Dazu brauchst du aber 
am besten eine Factory.

Wenn du wirklich nur ein Objekt brauchst ist das ganze natürlich 
hinfällig :)

von Uhu U. (uhu)


Lesenswert?

Matthias S. schrieb:
> Jetzt bekomme ich den Compilerfehler "Die Zuordnung zu "<this>" ist
> nicht möglich, da das Element schreibgeschützt ist.

Objekte dürfen sich nicht selbst überscheiben - ist doch eigentlich 
einleuchtend.

von Matthias S. (da_user)


Lesenswert?

Peter II schrieb:
> Matthias S. schrieb:
>> Methoden innerhalb der Klasse bleiben, oder muss ich die nach extern
>> auslagern?
>
> du kannst du methode als static machen.
>
> static public Konfig LoadConfig() {
>    return (Konfig)deserializer.Deserialize(stream);
> }
>
> Und dann kannst du doch einfach
>
> Konfig k = Konfig.LoadConfig();
>
> machen.

Hat funktioniert. Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.