文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用C#怎么对XML对象进行序列化和反序列化操作

2023-06-06 14:34

关注

使用C#怎么对XML对象进行序列化和反序列化操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

public class XMLUtil{    /// <summary>    /// XML & Datacontract Serialize & Deserialize Helper    /// </summary>    /// <typeparam name="T"></typeparam>    /// <param name="serialObject"></param>    /// <returns></returns>    public static string Serializer<T>(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<T>(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]说明,从而在进行序列化时候跳过这些对象,就像下面的方式。

/// <summary>///背景颜色/// </summary>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);

  那么这个对象在进行序列化的时候该怎么进行保存呢?同样的原理我们可以通过下面的方式。

/// <summary>///背景颜色/// </summary>private SolidColorBrush _BackgroundColor;[XmlIgnore]public SolidColorBrush BackgroundColor{    get    {        return _BackgroundColor;    }    set    {        if (value != _BackgroundColor)        {            _BackgroundColor = value;            OnPropertyChanged("BackgroundColor");        }    }} /// <summary>///背景颜色ARGB/// </summary>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字段最终是通过怎样的方式来保存的?   

使用C#怎么对XML对象进行序列化和反序列化操作

    在进行反序列化的时候会将这个argb和value反序列化为一个byte数组。

    除了这些特例意外,有时候经常需要将一些对象的数组进行序列化,那么原理是什么呢?这里我借用别人的一个例子来进行相关的说明。

 对象数组的Xml序列化:

 数组的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; }    }}

  最终获得的结果是:  

<?xml version="1.0" encoding="gb2312"?><cats xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <items>    <item color="White">      <saying>White or black,  so long as the cat can catch mice,  it is a good cat</saying>    </item>    <item color="Black">      <saying>White or black,  so long as the cat can catch mice,  it is a good cat</saying>    </item>  </items></cats> 

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯