Laden...

Kindklasse aus abstrakter Klasse serialisieren

Erstellt von Cornflake vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.145 Views
C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 8 Jahren
Kindklasse aus abstrakter Klasse serialisieren

Hallo

In meiner Basisklasse soll eine Methode zum serialisieren der davon abgeleiteten Kindklasse angeboten werden. Nur leider werden nur die public Werte der Basisklasse gespeichert. Hat dazu jemand eine Lösung?

Hier der Beispielaufbau zur Verdeutlichung:



public class  Basis
{
  public string Welt {get;set;}

  public void speichern()
  {
    tool.SerialisiereObjekt(this);
  }

}

public class Kind : Basis
{
  public string Hallo {get;set;}
}


public class main
{
  //...
  Kind k = new Kind();
  k.Hallo = "geht nicht";
  k.Welt = "geht";
  k.speichern();
  //...
}


In "this" steckt eine Kind Instanz, nur leider wird beim serialisieren nur die der "Welt" Wert serialisiert und nicht der "Hallo" Wert.

Wie kann ich das lösen?

Grüße Cornflake

P
1.090 Beiträge seit 2011
vor 8 Jahren

Mein Ansatz wäre, die Beiden belange von einander zu Trennen. Das sich eine Klasse sich selber Speichern kann ist meistens unschön. Mach eine Klasse die für das Speichern Verantwortlich ist.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 8 Jahren

Naja eigentlich will ich das so ähnlich machen wie bei der Settingsklasse (Settings.settings). Da kannst du Einstellungen festlegen und dann diese auch speichern.

Die Kindklasse beinhaltet die Konfiguration des aktuellen Programmes und die Basisklasse liefert die Möglichkeit die Konfiguration abspeichern zu können. Daher will ich das auch nicht unbedingt trennen. Die Frage stellt sich mir daher eher, wie kann ich in der Basisklasse sagen, das "this" auf die Kindklasse gecastet an die Serialisierungsmethode übergeben wird.
Diese Methode kommt dann eigentlich von Json.net (JsonConvert.SerializeObject(this)).

5.657 Beiträge seit 2006
vor 8 Jahren

Hi Cornflake,

was du suchst, ist das IContractResolver -Interface.

Für deine Anforderungen ist es allerdings empfehenswert, das [Tutorial] Konfigurationsmodell im .NET Framework zu verwenden und/oder die zu serialisierenden Eigenschaften zu veröffentlichen.

Christian

Weeks of programming can save you hours of planning

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 8 Jahren

Hallo MrSparkle

Danke für deine Antwort.
Wenn ich den ContractResolver richtig verstehe, kann ich damit aus einem Objekt z.B. alle Properties mit einem bestimmten Buchstaben beginnend auflösen. Allerdings ist mir nicht klar, wie ich damit auf die Kindklasse casten soll.

Zum Thema [Tutorial] Konfigurationsmodell im .NET Framework gabs glaube ich schon viele Disskussionen zum MS Konfigurationsmodell. Solange es für mich keine Möglichkeit gibt den Speicherort und Name der XML Datei selber festlegen zu können und ich somit auch z.B. nicht unterschiedliche Konfigurationsdateistände für mein Programm laden kann, ist das MS Konfigurationsmodell für mich nicht praktikabel. Egal ob jetzt wieder Argumente kommen, dass nur dieses Modell die Konfigurationsdatei an einem sinnvollen Ort speichert.

Grüße Cornflake

5.657 Beiträge seit 2006
vor 8 Jahren

Wo genau liegt das Problem? An welcher Stelle mußt du denn casten?

Weeks of programming can save you hours of planning

16.807 Beiträge seit 2008
vor 8 Jahren

Deine Basisklasse ist gar nicht abstrakt, das ist Dir bewusst?

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 8 Jahren

@abt: Stimmt habe ich oben vergessen einzutragen. Aber ich glaube nachdem ich die Instanz vom Kind übergebe ist es egal ob die Basisklasse abstrakt ist oder nicht.

@MrSparkle: Wenn ich es richtig sehe müsste ich hier:


public void speichern()
  {
    tool.SerialisiereObjekt((Kind)this);  //Kind
  }

casten, damit beim Serialisieren mit Json.net nicht:


{
  "Welt": "geht"
}

sondern


{
  "Welt": "geht",   //wenn das fehlen würde, würde es mich nicht stören
  "Hallo": "geht nicht"
}

als Ergebnis steht.

5.657 Beiträge seit 2006
vor 8 Jahren

Wenn ich es richtig sehe müsste ich

Nein. In der Doku kannst du nachlesen, wie das korrekte Verhalten ist. Oder du kannst es einfach ausprobieren. Beides wäre schneller gegangen, als die Frage hier im Forum zu stellen. Bitte zukünftig [Hinweis] Wie poste ich richtig? Punkt 1.1 und 4 beachten!

Christian

Weeks of programming can save you hours of planning

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 8 Jahren

Leute sorry 8o
Habe gerade meinen Fehler entdeckt.
Das ganze funktioniert ohne casten. Der Grund, warum das Property "Hallo" gefehlt hat, ist dass es "public static" war. Anscheinend darf kein "static" drinnen stehen. 🙁

Daraus würde sich jetzt nur die Frage ergeben, wenn in einer Klasse public Properties mit und ohne static vorhanden sind, wie kann ich json.net sagen, dass die static auch mitgenommen werden sollen?

@MrSparkle: Werde wegen static mit serialisieren in der json.net Doku nachschauen und mich melden, wenn ich nichts entdecke.

5.657 Beiträge seit 2006
vor 8 Jahren

Da wirst du in der Doku nichts zu finden, außer, daß es nicht funktioniert. Ein statisches Property zu serialisieren ergibt auch irgendwie keinen Sinn. Du solltest die statischen Eigenschaften lieber in einer GlobalSettings-Klasse oder sowas ablegen, und diese dann (de-)serialisieren.

Weeks of programming can save you hours of planning

16.807 Beiträge seit 2008
vor 8 Jahren

Wieder ein Beweis, dass man den Code posten sollte, den man auch vor sich hat.
So haben jetzt einige Leute völlig umsonst Zeit investiert.....

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 8 Jahren

@MrSparkle: Stimmt hast recht. Static kann über "this" nicht gehen, da es sich nicht auf eine Instanz bezieht. Bin heute anscheinend schon überarbeitet.

@Abt: Im Prinzip haste Recht, aber 20 Properties, Methoden, etc. zu posten, finde ich stiftet vllt. mehr Verwirrung als Nutzen.
Aber beim Nächsten mal versuche ich vom Vorgehen her, erst den Originalcode reinzukopieren und dann nur unnötige Zeilen zu entfernen und abschließend vllt. Variablennamen zu vereinfachen. Dann sollten abstrakt, static, public, etc. Dinge nicht mehr fehlen.
Alternativ vorher ein Miniprojekt mit dem zu postenden Code aufsetzen und den Inhalt dann ins Forum kopieren.

👍 Vielen Dank Leute für eure Mühe und schnellen Antworten.