Как сериализировать/десериализовать простые классы к 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; }
}

Скажем, я создаю a ShoppingCart объект в памяти и хочет "сохранить" его как XML-документ. Это возможное через некоторый XDocument.CreateFromPOCO(shoppingCart) метод? Как насчет в другом направлении: есть ли встроенный способ создать a ShoppingCart объект из XML-документа как new ShoppingCart(xDoc)?

24
задан pnuts 18 September 2015 в 13:14
поделиться

3 ответа

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 .

52
ответ дан 28 November 2019 в 22:43
поделиться

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

0
ответ дан 28 November 2019 в 22:43
поделиться

Вы можете сериализовать / десериализовать либо 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);
}
2
ответ дан 28 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: