web-dev-qa-db-fra.com

Comment sérialiser / désérialiser des classes simples en XML et inversement

Parfois, je veux émuler les données stockées de mes classes sans configurer un aller-retour vers la base de données. Par exemple, disons que j'ai les classes suivantes:

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; }
}

Supposons que je construise un objet ShoppingCart en mémoire et que je "l'enregistre" en tant que document XML. Est-ce possible via une sorte de méthode XDocument.CreateFromPOCO(shoppingCart)? Et dans l'autre sens: existe-t-il un moyen intégré de créer un objet ShoppingCart à partir d'un document XML comme new ShoppingCart(xDoc)?

24
Ben McCormack

XmlSerializer est une façon de le faire. DataContractSerializer en est un autre. Exemple avec 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);
}

et pour le désérialiser:

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

Aussi pour une meilleure encapsulation, je vous recommande d'utiliser des propriétés au lieu des champs dans votre classe CartItem.

54
Darin Dimitrov

Bien fait. Voici l'exemple pour sérialiser POCO ordinaire en chaîne.

    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();
    }
9
Jeson Martajaya

Vous pouvez sérialiser/désérialiser avec le XmlSerializer ou le DataContractSerializer .

Annotez vos classes avec les attributs DataContract et DataMember et écrivez quelque chose comme ceci pour sérialiser en xml dans un fichier.

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

Marquez simplement ce que vous voulez sérialiser avec [XmlElement (name)] (ou XmlAttribute, XmlRoot, etc.), puis utilisez XmlSerializer. Si vous avez besoin d'un formatage vraiment personnalisé, implémentez IXmlSerializable.

0
AllenG