如何将简单类序列化/反序列化为XML并返回

Ben*_*ack 24 .net c# xml poco

有时我想模拟我的类的存储数据而不设置数据库的往返.例如,假设我有以下类:

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; }
}
Run Code Online (Sandbox Code Playgroud)

假设我ShoppingCart在内存中构建了一个对象,并希望将其"保存"为XML文档.这有可能通过某种XDocument.CreateFromPOCO(shoppingCart)方法吗?在另一个方向怎么样:是否有一种ShoppingCart从XML文档创建对象的内置方法,如new ShoppingCart(xDoc)

Dar*_*rov 52

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);
}
Run Code Online (Sandbox Code Playgroud)

并将其反序列化:

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

另外,为了更好的封装,我建议您使用属性而不是CartItem类中的字段.

  • 我希望在过去几周我每次导航到这个答案时都可以给你一个upvote.它不断支付股息! (3认同)

Jes*_*aya 8

做得很好.以下是将普通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();
    }
Run Code Online (Sandbox Code Playgroud)