Иногда я хочу эмулировать хранившие данные своих классов, не настраивая распространение в прямом и обратном направлениях к базе данных. Например, скажем, у меня есть следующие классы:
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; }
}
Скажем, я создаю a ShoppingCart
объект в памяти и хочет "сохранить" его как XML-документ. Это возможное через некоторый XDocument.CreateFromPOCO(shoppingCart)
метод? Как насчет в другом направлении: есть ли встроенный способ создать a ShoppingCart
объект из XML-документа как new ShoppingCart(xDoc)
?
XmlSerializer - один из способов сделать это. DataContractSerializer - другое. Пример с 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);
}
и обратной десериализацией:
var serializer = new XmlSerializer(typeof(ShoppingCart));
using (var reader = XmlReader.Create("shoppingcart.xml"))
{
var shoppingCart = (ShoppingCart)serializer.Deserialize(reader);
}
Также для лучшей инкапсуляции я бы рекомендовал вам использовать свойства вместо полей в вашем классе CartItem
.
Просто отметьте то, что вы хотите сериализовать, с помощью [XmlElement ( name )] (или XmlAttribute, XmlRoot и т. Д.), А затем используйте XmlSerializer. Если вам нужно действительно настраиваемое форматирование, реализуйте IXmlSerializable.
Вы можете сериализовать / десериализовать либо XmlSerializer , либо DataContractSerializer .
Аннотируйте свои классы с помощью атрибутов DataContract
и DataMember
и напишите что-то подобное для сериализации в xml в файл.
ShoppingCart cart = ...
using(FileStream writer = new FileStream(fileName, FileMode.Create))
{
DataContractSerializer ser = new DataContractSerializer(typeof(ShoppingCart));
ser.WriteObject(writer, cart);
}