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)
?
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
.
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();
}
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);
}
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.