繁体   English   中英

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

[英]How to serialize/deserialize simple classes to XML and back

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

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)方法实现的吗? 另一方面怎么样:是否有一种内置方法可以new ShoppingCart(xDoc)等XML文档中创建ShoppingCart对象?

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类中的字段。

做得很好。 以下是将普通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();
    }

您可以使用XmlSerializerDataContractSerializer序列化/反序列化。

使用DataContractDataMember属性注释您的类,并编写类似这样的内容,以序列化为xml到文件。

ShoppingCart cart = ...
using(FileStream writer = new FileStream(fileName, FileMode.Create))
{
   DataContractSerializer ser = new DataContractSerializer(typeof(ShoppingCart));
   ser.WriteObject(writer, cart);
}

只需使用[XmlElement( name )](或XmlAttribute,XmlRoot等)标记要序列化的内容,然后使用XmlSerializer。 如果您需要真正的自定义格式化,请实现IXmlSerializable。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM