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
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ß
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.
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...)
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.
@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?
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.
Stimmt. Das ist auch eigentlich die Lizenz, die ich wollte. Werde es gleich ändern.
Gruß, Christian.