29 Stimmen

Serialisierung/Deserialisierung einfacher Klassen nach XML und zurück

Manchmal möchte ich gespeicherte Daten meiner Klassen emulieren, ohne einen Round Trip zur Datenbank einzurichten. Nehmen wir zum Beispiel an, ich habe die folgenden Klassen:

public class ShoppingCart
{
    public List<CartItem> Items {get; set;}
    public int UserID { get; set; }
}

public class CartItem
{
    public int SkuID { get; set; }
    public int Quantity  { get; set; }
    public double ExtendedCost  { get; set; }
}

Sagen wir, ich baue eine ShoppingCart Objekt im Speicher und möchte es als XML-Dokument "speichern". Ist dies möglich über eine Art von XDocument.CreateFromPOCO(shoppingCart) Methode? Wie sieht es in der anderen Richtung aus: Gibt es eine eingebaute Möglichkeit, eine ShoppingCart Objekt aus einem XML-Dokument wie new ShoppingCart(xDoc) ?

62voto

Darin Dimitrov Punkte 990883

XmlSerializer ist eine Möglichkeit, dies zu tun. DataContractSerializer ist eine andere. Beispiel mit XmlSerializer :

using System.Xml;
using System.Xml.Serialization;

//...

ShoppingCart shoppingCart = FetchShoppingCartFromSomewhere();
var serializer = new XmlSerializer(shoppingCart.GetType());
using (var writer = XmlWriter.Create("shoppingcart.xml"))
{
    serializer.Serialize(writer, shoppingCart);
}

und zurück zu deserialisieren:

var serializer = new XmlSerializer(typeof(ShoppingCart));
using (var reader = XmlReader.Create("shoppingcart.xml"))
{
    var shoppingCart = (ShoppingCart)serializer.Deserialize(reader);
}

Auch für eine bessere Kapselung würde ich Ihnen empfehlen, Eigenschaften anstelle von Feldern in Ihrem CartItem Klasse.

13voto

Jeson Martajaya Punkte 6621

Sehr gut gemacht. Hier ist das Beispiel für die Serialisierung von POCO zu String.

    private string poco2Xml(object obj)
    {
        XmlSerializer serializer = new XmlSerializer(obj.GetType());
        StringBuilder result = new StringBuilder();
        using (var writer = XmlWriter.Create(result))
        {
            serializer.Serialize(writer, obj);
        }
        return result.ToString();
    }

3voto

Mikael Svenson Punkte 37911

Sie können serialisieren/deserialisieren entweder mit dem XmlSerializer oder die DatenVertragSerialisierer .

Beschriften Sie Ihre Klassen mit DataContract y DataMember Attribute und schreiben Sie etwas wie dieses, um xml in eine Datei zu serialisieren.

ShoppingCart cart = ...
using(FileStream writer = new FileStream(fileName, FileMode.Create))
{
   DataContractSerializer ser = new DataContractSerializer(typeof(ShoppingCart));
   ser.WriteObject(writer, cart);
}

0voto

AllenG Punkte 8032

Markieren Sie einfach, was Sie serialisieren möchten, mit [XmlElement( Name )] (oder XmlAttribute, XmlRoot, usw.) und verwenden Sie dann den XmlSerializer. Wenn Sie wirklich benutzerdefinierte Formatierung benötigen, implementieren Sie IXmlSerializable.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X