十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
使用C#怎么对XML对象进行序列化和反序列化操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
成都创新互联是专业的开封网站建设公司,开封接单;提供网站制作、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行开封网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!public class XMLUtil { ////// XML & Datacontract Serialize & Deserialize Helper /// ////// /// public static string Serializer (T serialObject) where T : class { try { XmlSerializer ser = new XmlSerializer(typeof(T)); System.IO.MemoryStream mem = new MemoryStream(); XmlTextWriter writer = new XmlTextWriter(mem, Encoding.UTF8); ser.Serialize(writer, serialObject); writer.Close(); return Encoding.UTF8.GetString(mem.ToArray()); } catch (Exception ex) { return null; } } public static T Deserialize (string str) where T : class { try { XmlSerializer mySerializer = new XmlSerializer(typeof(T)); StreamReader mem2 = new StreamReader( new MemoryStream(System.Text.Encoding.UTF8.GetBytes(str)), System.Text.Encoding.UTF8); return (T)mySerializer.Deserialize(mem2); } catch (Exception) { return null; } } }
微软为我们提供的XmlSerializer这个类就为我们提供了这个可能,在序列化的过程中我们需要注意下面的情况,所有的属性必须是可序列化的对象,像BitmapImage、SolidColorBrush等这些对象都是不能够进行序列化的对象,如果用上面的方法进行序列化时将返回null,正确的方式是在这些字段上面加上[XmlIgnore]说明,从而在进行序列化时候跳过这些对象,就像下面的方式。
//////背景颜色 /// private SolidColorBrush _BackgroundColor; [XmlIgnore] public SolidColorBrush BackgroundColor { get { return _BackgroundColor; } set { if (value != _BackgroundColor) { _BackgroundColor = value; OnPropertyChanged("BackgroundColor"); } } }
那么像上面的这个SolidColorBrush对象该怎样去进行序列化呢,这里我们选择将当前颜色的ARGB值保存在一个byte数组中,从而在反序列化的时候通过Color.FromArgb的方式进行还原,就像下面的方式。
byte[] colorByte=savedModel.ConfigurationBaseModel.BackgroundColorArgb; Color backColor=Color.FromArgb(colorByte[0],colorByte[1],colorByte[2],colorByte[3]); sourceBaseModel.BackgroundColor = new SolidColorBrush(backColor);
那么这个对象在进行序列化的时候该怎么进行保存呢?同样的原理我们可以通过下面的方式。
//////背景颜色 /// private SolidColorBrush _BackgroundColor; [XmlIgnore] public SolidColorBrush BackgroundColor { get { return _BackgroundColor; } set { if (value != _BackgroundColor) { _BackgroundColor = value; OnPropertyChanged("BackgroundColor"); } } } //////背景颜色ARGB /// private byte[] _BackgroundColorArgb=new byte[4]; [XmlArray("argb"),XmlArrayItem("value")] public byte[] BackgroundColorArgb { get { if (null != _BackgroundColor) { Color color = _BackgroundColor.Color; _BackgroundColorArgb[0] = color.A; _BackgroundColorArgb[1] = color.R; _BackgroundColorArgb[2] = color.G; _BackgroundColorArgb[3] = color.B; } return _BackgroundColorArgb; } set { if (value != _BackgroundColorArgb) { _BackgroundColorArgb = value; OnPropertyChanged("BackgroundColorArgb"); } } }
这里在实际的使用中发现,就像byte数组必须通过[XmlArray("argb"),XmlArrayItem("value")] 这类型的标识来将其分类,在将其序列化完毕以后,我们可以看看这个BackgroundColorArgb字段最终是通过怎样的方式来保存的?
在进行反序列化的时候会将这个argb和value反序列化为一个byte数组。
除了这些特例意外,有时候经常需要将一些对象的数组进行序列化,那么原理是什么呢?这里我借用别人的一个例子来进行相关的说明。
数组的Xml序列化需要使用XmlArrayAttribute和XmlArrayItemAttribute;XmlArrayAttribute指定数组元素的Xml节点名,XmlArrayItemAttribute指定数组元素的Xml节点名。
如下代码示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization; namespace UseXmlSerialization { class Program { static void Main(string[] args) { //声明一个猫咪对象 var cWhite = new Cat { Color = "White", Speed = 10, Saying = "White or black, so long as the cat can catch mice, it is a good cat" }; var cBlack = new Cat { Color = "Black", Speed = 10, Saying = "White or black, so long as the cat can catch mice, it is a good cat" }; CatCollection cc = new CatCollection { Cats = new Cat[] { cWhite,cBlack} }; //序列化这个对象 XmlSerializer serializer = new XmlSerializer(typeof(CatCollection)); //将对象序列化输出到控制台 serializer.Serialize(Console.Out, cc); Console.Read(); } } [XmlRoot("cats")] public class CatCollection { [XmlArray("items"),XmlArrayItem("item")] public Cat[] Cats { get; set; } } [XmlRoot("cat")] public class Cat { //定义Color属性的序列化为cat节点的属性 [XmlAttribute("color")] public string Color { get; set; } //要求不序列化Speed属性 [XmlIgnore] public int Speed { get; set; } //设置Saying属性序列化为Xml子元素 [XmlElement("saying")] public string Saying { get; set; } } }
最终获得的结果是:
White or black, so long as the cat can catch mice, it is a good cat White or black, so long as the cat can catch mice, it is a good cat
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联网站建设公司,的支持。