Как сериализовать / десериализовать простые классы в XML и обратно - PullRequest
24 голосов
/ 29 июля 2010

Иногда я хочу эмулировать сохраненные данные моих классов, не настраивая обратную связь с базой данных.Например, допустим, у меня есть следующие классы:

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)?

Ответы [ 4 ]

50 голосов
/ 29 июля 2010

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.

7 голосов
/ 01 мая 2013

Отлично сделано.Вот пример для сериализации простого 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 голосов
/ 29 июля 2010

Вы можете сериализовать / десериализовать с помощью 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);
}
0 голосов
/ 29 июля 2010

Просто отметьте то, что вы хотите сериализовать, с помощью [XmlElement ( name )] (или XmlAttribute, XmlRoot и т. Д.), А затем используйте XmlSerializer.Если вам нужно действительно настраиваемое форматирование, реализуйте IXmlSerializable.

...