有时我想模拟我的类的存储数据而不设置数据库的往返。例如,假设我有以下类:
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)
对象?
答案 0 :(得分:50)
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
类中的字段。
答案 1 :(得分:7)
干得好。以下是将普通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();
}
答案 2 :(得分:2)
您可以使用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);
}
答案 3 :(得分:0)
使用[XmlElement( name )](或XmlAttribute,XmlRoot等)标记要序列化的内容,然后使用XmlSerializer。如果您需要真正的自定义格式化,请实现IXmlSerializable。