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
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:
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)).
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
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
Wo genau liegt das Problem? An welcher Stelle mußt du denn casten?
Weeks of programming can save you hours of planning
Deine Basisklasse ist gar nicht abstrakt, das ist Dir bewusst?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
@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.
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
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.
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
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.....
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
@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.