![]() |
verschachtelte Klassen serialisieren und Deserialisieren
hallo gemeinde :mrgreen:
Bräuchte mal einen gewaltigenSchlag auf den Hinterkopf. :!: wie Oben schon gesagt , möchte ich verschachtelte Klassen serialisieren. ich habe eine Klasse:
Delphi-Quellcode:
jetzt will ich erreichen , wenn Mitversicherte = true ist, meine Datei so aussieht:type TVersicherter = Class fName: String; fVorname: String; fNummer : Integer; fMitversicherte : Boolean; ... usw end;
XML-Code:
Für Hilfe in irgendeiner Weise wäre ich dankbar. Es kann auch in C# sein.
< TVersicherte
<Name> Mustermann </Name> <Vornmae> Manfred </Vorname> <Mitversicherte> true </Mitversicherte> <1.Mitversicherter <Name> Mustermann </NAme> <Vorname> Hanna </Vorname> </1.Miteversicherter> </TVersicherter> Danke Raik |
Re: verschachtelte Klassen serialisieren und Deserialisieren
Ging das nicht nochmal mit Listenproperties? :gruebel: Ich meine so wäre es gewesen.. Oder Array-Properties...
|
Re: verschachtelte Klassen serialisieren und Deserialisieren
"Fragestellen for D... äh Anfänger"
Außerdem, damit man mehr Lust zum Antworten bekommt:
|
Re: verschachtelte Klassen serialisieren und Deserialisieren
hallo Robert,
mein Gott, das ist 14 Tage her und da du sonst nicht antwortest, hatte ich ebend fast eine Herzattacke :shock: . die Frage hat sich erledigt. Da ich kein Netzzugang die ganze Woche habe, habe ich es einfacher realisiert. habe eine Klasse Einstellungen( jupp das T habe ich weggenommen :mrgreen: ) dort mache ich alles zusammen. Im Endeffekt sieht es dann so aus
XML-Code:
<Einstellungen>
< Versicherte> <Name> Mustermann </Name> <Vornmae> Manfred </Vorname> <Mitversicherte> true </Mitversicherte> </Versicherter> <1.Mitversicherter> <Name> Mustermann </NAme> <Vorname> Hanna </Vorname> </1.Miteversicherter> </Einstellungen> Raik |
Re: verschachtelte Klassen serialisieren und Deserialisieren
Wie du wieder gekonnt alle Punkte ignoriert hast... :mrgreen:
Wenn nun Karl-Heinz hier reinschaut und auf eine Lösung hofft, gibt's nur unser hohles Geblubber... :mrgreen: Deine Datei ist kein XML! 1.Mitversicherte dürfte kein korrekter Tag sein. ;) Du willst wohl sowas haben:
XML-Code:
Das sind effektiv 3 Klassen: Die Einstellungen, ein Versicherter und ein Hauptversicherter, der von Versicherter erbt um dann noch eine Eigenschaft Mitversicherte einzuführen.
<?xml version="1.0" encoding="utf-8" ?>
<Einstellungen xmlns="http://Raik.net/Einstellungen.xsd"> <Versicherte> <Versicherter Name="Mustermann" Vorname="Manfred"> <Mitversicherte> <Mitversicherter Name="Mustermann" Vorname="Hanna"/> </Mitversicherte> </Versicherter> </Versicherte> </Einstellungen> Ich hatte gerade Lust und habe das mal zusammengefriemelt. Du wirst es dir noch zu D.Net untersetzen müssen, aber das sollte easy möglich sein. (zumal dir ja auch C# nicht unbekannt ist ;) ) Der Versicherte:
Delphi-Quellcode:
Der Hauptversicherte:
uses
System.Xml.*; type [SerializableAttribute] [XmlTypeAttribute(&Namespace := 'http://Raik.net/Einstellungen.xsd')] Versicherter = public class public [XmlAttributeAttribute] property Name : String; [XmlAttributeAttribute] property Vorname : String; constructor; empty; //parameterloser constructor für den serializer constructor(name, vorname : String); end; implementation constructor Versicherter(name, vorname : String); begin self.Name := name; self.Vorname := vorname; end;
Delphi-Quellcode:
uses
System.Xml.*, System.Collections.Generic; type [SerializableAttribute] [XmlTypeAttribute(&Namespace := 'http://Raik.net/Einstellungen.xsd')] HauptVersicherter = public class(Versicherter) private fMitVersicherte : List<Versicherter> := new List<Versicherter>(); public [XmlArrayAttribute('Mitversicherte')] [XmlArrayItemAttribute('Mitversicherter', IsNullable := false)] property MitVersicherte : List<Versicherter> read fMitVersicherte; end; Und die Einstellungen:
Delphi-Quellcode:
Alles "dumme" Daten container mit ein paar Attributen, die das XML Mapping steuern.
uses
System.Xml.*, System.Collections.Generic; type [XmlRootAttribute(&Namespace := 'http://Raik.net/Einstellungen.xsd', IsNullable := false)] Einstellungen = public class private fVersicherte: List<HauptVersicherter> := new List<HauptVersicherter>(); protected public [XmlArrayAttribute('Versicherte')] [XmlArrayItemAttribute('Versicherter', typeof(HauptVersicherter), IsNullable := false)] property Versicherte : List<HauptVersicherter> read fVersicherte; end; Hier noch Bleistift code zum Laden und Speichern:
Delphi-Quellcode:
Ist eigentlich ziemlich easy und spätestens beim Übersetzen sollte der Groschen fallen. ;)
class method ConsoleApp.Load(fileName : String);
begin var serializer := new XmlSerializer(typeof(Einstellungen)); using reader := new XmlTextReader(fileName) do var einstellungen := serializer.Deserialize(reader) as Einstellungen; end; class method ConsoleApp.Save(fileName : String); begin var serializer := new XmlSerializer(typeof(Einstellungen)); var einstellungen := new Einstellungen(); with hauptVersicherter := new HauptVersicherter('Mustermann', 'Manfred') do begin hauptVersicherter.MitVersicherte.Add(new Versicherter('Mustermann', 'Hanna')); einstellungen.Versicherte.Add(hauptVersicherter); end; using writer := new XmlTextWriter(fileName, Encoding.UTF8) do serializer.Serialize(writer, einstellungen); end; |
Re: verschachtelte Klassen serialisieren und Deserialisieren
hallo Robert,
erstmal Danke, werde es mir zu Gemüte führen. Meine XML Datei sieht schon richtig aus, habe auch die Klasse Einstellungen anderst gestaltet. habe ebend keine Zeit muss Hausaufgaben machen :mrgreen:. melde mich heute abend nochmal. Eine kurze Frage: Was macht der Parameterlose Constructor? ..... nicht gleich wieder 'dummes Schwein' sagen, bin nur schnell über dein Code gerasselt. raik |
Re: verschachtelte Klassen serialisieren und Deserialisieren
Zitat:
Der Serializer sucht sich einen parameterlosen Constructor um eine Instanz anzulegen. Findet er keinen knallt's. Hier muss der Constructor nix machen. Zitat:
|
Re: verschachtelte Klassen serialisieren und Deserialisieren
Zitat:
raik |
Re: verschachtelte Klassen serialisieren und Deserialisieren
Zitat:
Was ist denn jetzt so schlimm? Du kannst du doch vorerst einen parameterlosen constructor neben dem nehmen, den du schon hast. Nachdem D2007 rausgekommen ist ( :mrgreen: ) kannst du den dann in der Sichtbarkeit auf assembly Level reduzieren und das neue ![]() ![]() |
Re: verschachtelte Klassen serialisieren und Deserialisieren
Moin Robert,
habe versucht das ganze zu übersetzen. Bin leider an der List <''> gescheitert. wäre nicht schlecht, wenn du der gescheiterten Existenz noch mal auf die Sprünge helfen könntest. :mrgreen: raik |
Re: verschachtelte Klassen serialisieren und Deserialisieren
Zitat:
gerne doch. ;) Eine List<Miep> ist eine arraybasierte Collection mit Elementen vom Typ Miep, das ganze fällt unter das Schlagwort "generics". Um das unter .Net 1.1 zu bekommen gibt es zum Beispiel den collection wizard aus #d. Da du D.Net benutzt und bisher kein .Net Compiler circuläre Referenzen von Assemblies unterstützt sehe ich für dich nur drei Möglichkeiten.
btw: Nein, Du kannst keine ArrayList nehmen, da die beim Serialisieren *ziemlich* zickig ist. ;) Außerdem:
Delphi-Quellcode:
entspricht in Delphi.Net:
uses System.Xml.*;
... begin var serializer := new XmlSerializer(typeof(Einstellungen)); using reader := new XmlTextReader(fileName) do var einstellungen := serializer.Deserialize(reader) as Einstellungen; end;
Delphi-Quellcode:
[1] Ich hoffe es reicht den namespace vor den Typen zu packen um einen Name clash zu vermeiden.
uses
System.Xml, System.Xml.Serialization; ... var einstellungen : DeinNamespcae.Einstellungen; //siehe [1] reader : XmlTextReader; serializer : XmlSerializer; begin serializer := XmlSerializer.Create(typeof(DeinNamespcae.Einstellungen)); //siehe [1] reader := XmlTextReader.Create(fileName); try einstellungen := serializer.Deserialize(reader) as Einstellungen; finally reader.Dispose(); end; end; Falls nicht musst du dir wohl irgendeinen komischen Variablennamen ausdenken. D.Nets compiler kann nicht untercheiden wann etwas ein Typ eine Variable oder Property ist. ;) |
Re: verschachtelte Klassen serialisieren und Deserialisieren
Moin Robert,
Erstmal Dank, das du dich meiner annimmst :mrgreen: Das mir dem Serialisieren habe ich schon in Delphi hingekriegt, ich konnte auch deine Klasse Versicherter serialisieren, bei den anderen hatte ich immer das Problem mit List<>. wenn ich aber
Delphi-Quellcode:
eingegeben habe wurde mir generic nicht vorgeschlagen. Deshalb bin ich da auch nicht weitergekommen.
System.Xml
nun ist ja Delphi 2005 nicht mit einer Hilfe ausgestattet(bei mir), so dass ich nur die Hilfe in #d , dank an <Rober_G> simmatze </Rober_G>, zur Verfügung habe :mrgreen: . Zitat:
Zitat:
jetzt werde ich bloss noch ein verstohlendes F5 machen können. Ich werde mir morgen aber den 1. Weg zu Gemüte führen und dich wahrscheinlich weiterhin nerven. der Masochist |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz