Laden...

EntityDocument

Erstellt von TheBrainiac vor 13 Jahren Letzter Beitrag vor 13 Jahren 6.180 Views
TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 13 Jahren
EntityDocument

Beschreibung:

EntityDocument ist eine einfache Klasse zur Erstellung von Xml-Dokumenten mit Entitäts-Klassen als Inhalt.

Da Code mehr als 1.000 Worte sagt:

Folgende Daten werden im Beispiel benutzt

Herr Wurst, Hans [19.06.1987; Male]
  PostalAddress (privat) Baumallee 1, 12345 Baumhausen, Deutschland
  PostalAddress (geschäftlich) Stahlstraße 1, 12345 Eisenhausen, Deutschland
  EMailAddress (privat) hans@wurst.de
  EMailAddress (geschäftlich) h.wurst@stahlfirma.de

Zum Speichern:

var hansWurst = new Person() {
    FirstName = "Hans",
    LastName = "Wurst",
    Salutation = "Herr",
    Gender = Gender.Male,
    DateOfBirth = new DateTime(1987, 6, 19),
    Tag = Image.FromFile(@"C:\myImages\test.png")
};

hansWurst.Addresses.Add(new PostalAddress() {
                            Name = "privat",
                            Locality = "Baumallee 1",
                            ZipCode = "12345",
                            City = "Baumhausen",
                            Country = "Deutschland"
                        });

hansWurst.Addresses.Add(new PostalAddress() {
                            Name = "geschäftlich",
                            Locality = "Stahlstraße 1",
                            ZipCode = "12345",
                            City = "Eisenhausen",
                            Country = "Deutschland"
                        });

hansWurst.Addresses.Add(new EMailAddress() {
                            Name = "privat",
                            EMail = "hans@wurst.de"
                        });

hansWurst.Addresses.Add(new EMailAddress() {
                            Name = "geschäftlich",
                            EMail = "h.wurst@stahlfirma.de"
                        });

EntityDocument.Save("hans-wurst.xml", hansWurst);

Zum Laden:

var entities = EntityDocument.Load("hans-wurst.xml");

var person = (Person) entities[0];

var image = person.Tag as Image;

if (image != null) {
    myControl.BackgroundImage = image;
}

Dieses Snippet erzeugt folgendes XML-Markup:

<?xml version="1.0" encoding="utf-8"?>
<EntityDocument>
  <Types>
    <Type name="PostalAddress" type="StudyManager.Data.Entities.PostalAddress, StudyManager, Version=1.0.3832.30437, Culture=neutral, PublicKeyToken=null" />
    <Type name="EMailAddress" type="StudyManager.Data.Entities.EMailAddress, StudyManager, Version=1.0.3832.30437, Culture=neutral, PublicKeyToken=null" />
    <Type name="Person" type="StudyManager.Data.Entities.Person, StudyManager, Version=1.0.3832.30437, Culture=neutral, PublicKeyToken=null" />
  </Types>
  <TopLevel>
    <Entity id="{6df21ebd-420e-4184-b850-e7c5077264ab}" />
  </TopLevel>
  <Entities>
    <Entity type="PostalAddress" id="{b4d64d17-f75d-4153-81fb-6880a595bda7}">
      <Name><![CDATA[privat]]></Name>
      <Locality><![CDATA[Baumallee 1]]></Locality>
      <ZipCode><![CDATA[12345]]></ZipCode>
      <City><![CDATA[Baumhausen]]></City>
      <Country><![CDATA[Deutschland]]></Country>
    </Entity>
    <Entity type="PostalAddress" id="{c1680124-e168-485f-b9cf-e46beeefa4e6}">
      <Name><![CDATA[geschäftlich]]></Name>
      <Locality><![CDATA[Stahlstraße 1]]></Locality>
      <ZipCode><![CDATA[12345]]></ZipCode>
      <City><![CDATA[Eisenhausen]]></City>
      <Country><![CDATA[Deutschland]]></Country>
    </Entity>
    <Entity type="EMailAddress" id="{9e8a808a-f08c-43d4-bcf1-cc449c617403}">
      <Name><![CDATA[privat]]></Name>
      <EMail><![CDATA[hans@wurst.de]]></EMail>
    </Entity>
    <Entity type="EMailAddress" id="{eaa32faf-c3c6-4ff6-8ca7-1db606023be8}">
      <Name><![CDATA[geschäftlich]]></Name>
      <EMail><![CDATA[h.wurst@stahlfirma.de]]></EMail>
    </Entity>
    <Entity type="Person" id="{6df21ebd-420e-4184-b850-e7c5077264ab}">
      <FirstName><![CDATA[Hans]]></FirstName>
      <LastName><![CDATA[Wurst]]></LastName>
      <Salutation><![CDATA[Herr]]></Salutation>
      <Gender value="1" />
      <DateOfBirth value="626866560000000000" />
      <Addresses>
        <Entity id="{b4d64d17-f75d-4153-81fb-6880a595bda7}" />
        <Entity id="{c1680124-e168-485f-b9cf-e46beeefa4e6}" />
        <Entity id="{9e8a808a-f08c-43d4-bcf1-cc449c617403}" />
        <Entity id="{eaa32faf-c3c6-4ff6-8ca7-1db606023be8}" />
      </Addresses>
      <Tag isSerializable="true"><!-- Hier steht normalerweise ein CDATA-Block mit Base64-encodierten Daten. Den habe ich hier weg gelassen. Wäre zu lange :-P --></Tag>
    </Entity>
  </Entities>
</EntityDocument>

Download & Dokumontation:
Den Download und die Dokumentation findet ihr ab sofort hier!

**ChangeLog:***25.06.10: Serialisierung und Deserialisierung von XML unabhänig gemacht: *25.06.10: Klasse EntityReader hinzugefügt *25.06.10: Klasse EntityWriter hinzugefügt *25.06.10: Methode LoadPropertiesFromDocument in Deserialize *25.06.10: Methode SavePropertiesToDocument in Serialize umbenannt. *29.06.10: Der Klasse Person die Eigenschaft Tag hinzugefügt. *29.06.10: Den Klassen EntityReader und EntityWriter jeweils Methoden zum Speichern / Laden von Objekten hinzugefügt

Schlagwörter: entity document xml serialization serialisierung entität dokument

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
B
387 Beiträge seit 2005
vor 13 Jahren

Hi Schamese,

gleich mal ein großes Lob von mir. Neulich hab ich erst nach eine Art Xml-Serialisierer gesucht, welcher kein Reflection verwendet. Und zusätzlich fällt auch das Problem weg, das einzelne Objekte aufgrund mehrerer Referenzen auch mehrfach serialisiert werden.

Nachteil, den ich jetzt sehe, ist, dass man viel auf Xml-Schicht selber programmieren muss (Methoden LoadProperties und SaveProperties). Aber gut, ich denk mal, da würde man nicht drum rum kommen, ohne Reflection zu verwenden.

Gruß

TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 13 Jahren

Hi, Blacal.

Ich habe die Klasse schon erweitert, sodass man um das eigentliche XML herumkommt. Bin aber gerade auf Arbeit. Werde den neuen Stand heute Abend hochladen.

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 13 Jahren

So.

Ich habe die aktuelle Version im ersten Post hochgeladen.

Das De-/Serialisieren läuft jetzt so ab:

public class Person : EntityBase
{
    protected override void Deserialize(EntityReader reader) {
        m_FirstName = reader.GetString("FirstName");
        m_LastName = reader.GetString("LastName");
        m_Salutation = reader.GetString("Salutation");
        m_Gender = (Gender) reader.GetInt32("Gender");
        m_DateOfBirth = new DateTime(reader.GetInt64("DateOfBirth"));
        
        foreach (var entity in reader.GetReferencedEntities("Addresses")) {
            m_Addresses.Add((AddressBase)entity);
        }
        
        m_Tag = reader.GetObject("Tag");
    }

    protected override void Serialize(EntityWriter writer) {
        writer.Set("FirstName", m_FirstName);
        writer.Set("LastName", m_LastName);
        writer.Set("Salutation", m_Salutation);
        writer.Set("Gender", (int)m_Gender);
        writer.Set("DateOfBirth", m_DateOfBirth.Ticks);
        writer.SetReferencedEntities("Addresses", m_Addresses);
        writer.Set("Tag", m_Tag);
    }
}

Gruß, Christian.

// Edit: An aktuelle Version angepasst. (Eigenschaft Tag hinzugefügt...)

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 13 Jahren

Ich habe das Projekt wieder etwas erweitert. Man kann nun auch serialisierbare Objekte speichern, die nicht von EntityBase ableiten.

Änderungen siehe in den vorherigen Posts.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
F
10.010 Beiträge seit 2004
vor 13 Jahren

@TheBrainiac:
Durch die wahl der GPL als Lizenz wird die Nutzung nur leider in 99% der Fälle verhindert und so die Verbreitung extrem eingeschränkt.

Gibt es einen bestimmten Grund diese Virulente Version der Lizenz zu benutzen?

TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 13 Jahren

Durch die wahl der GPL als Lizenz wird die Nutzung nur leider in 99% der Fälle verhindert und so die Verbreitung extrem eingeschränkt.

Warum? Unter welche Lizenz soll ich die Komponenten denn dann stellen, damit sie für alle benutzbar ist (ruhig auch kommerziell & in veränderter Form), ich aber als Copyrightinhaber erhalten bleibe? Wenn ich das als Public Domain einstelle, bin ich ja nicht mehr Copyrightinhaber, oder?

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
M
334 Beiträge seit 2007
vor 13 Jahren

Ich glaube die LGPL wäre dann besser. 🙂

TheBrainiac Themenstarter:in
795 Beiträge seit 2006
vor 13 Jahren

Stimmt. Das ist auch eigentlich die Lizenz, die ich wollte. Werde es gleich ändern.

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`