Как сериализовать/десериализовать простые классы в XML и обратно
Иногда я хочу эмулировать сохраненные данные моих классов, не настраивая туда поездку в базу данных. Например, допустим, что у меня есть следующие классы:
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; }
}
Скажем, я создаю объект ShoppingCart
в памяти и хочу "сохранить" его как XML-документ. Возможно ли это с помощью какого-то метода XDocument.CreateFromPOCO(shoppingCart)
? Как в другом направлении: существует ли встроенный способ создания объекта ShoppingCart
из документа XML, такого как new ShoppingCart(xDoc)
?
Ответы
Ответ 1
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
.
Ответ 2
Красиво сделано. Вот пример, чтобы сериализовать простой POCO в строку.
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();
}
Ответ 3
Вы можете сериализовать/десериализовать либо с помощью 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);
}
Ответ 4
Просто пометьте, что вы хотите сериализовать с помощью [XmlElement (name)] (или XmlAttribute, XmlRoot и т.д.), а затем используйте XmlSerializer. Если вам действительно нужна специальная формация, выполните IXmlSerializable.