Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#5

Re: verschachtelte Klassen serialisieren und Deserialisieren

  Alt 6. Nov 2005, 14:19
Wie du wieder gekonnt alle Punkte ignoriert hast...
Wenn nun Karl-Heinz hier reinschaut und auf eine Lösung hofft, gibt's nur unser hohles Geblubber...

Deine Datei ist kein XML! 1.Mitversicherte dürfte kein korrekter Tag sein.
Du willst wohl sowas haben:
XML-Code:
<?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>
Das sind effektiv 3 Klassen: Die Einstellungen, ein Versicherter und ein Hauptversicherter, der von Versicherter erbt um dann noch eine Eigenschaft Mitversicherte einzuführen.

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:
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;
Der Hauptversicherte:

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:
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;
Alles "dumme" Daten container mit ein paar Attributen, die das XML Mapping steuern.

Hier noch Bleistift code zum Laden und Speichern:
Delphi-Quellcode:
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;
Ist eigentlich ziemlich easy und spätestens beim Übersetzen sollte der Groschen fallen.
  Mit Zitat antworten Zitat