代码之家  ›  专栏  ›  技术社区  ›  Ben McCormack

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

  •  23
  • Ben McCormack  · 技术社区  · 16 年前

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

    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) 方法?在另一个方向怎么样:有内置的方法来创建一个 购物卡 来自XML文档的对象,如 new ShoppingCart(xDoc) ?

    4 回复  |  直到 11 年前
        1
  •  49
  •   Bartho Bernsmann    11 年前

    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 班级。

        2
  •  7
  •   Jeson Martajaya    13 年前

    做得很好。下面是将普通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();
        }
    
        3
  •  2
  •   Mikael Svenson    16 年前

    您可以使用 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);
    }
    
        4
  •  0
  •   AllenG    16 年前

    用[xmlElement]标记要序列化的内容( 名称 )](或xmltattribute、xmlroot等),然后使用xmlserializer。如果您真的需要自定义格式化,请实现IXML可序列化。