C# 進行用(反)序列化方法實現xml與對象進行互相轉換

在開發過程中我們可能會進行xml字符傳與指定對象之間進行互相轉換。用XmlSerializer對象可以把C#對象轉換成xml字符串,當然也可以把xml字符串反序爲指定的對象。我們用到以下的類方法進行操作

public class XmlHelper
    {
        /// <summary>
        /// 把對象轉換成xml
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static string serialize(object o)
        {
            var xml = "";
            if (o == null)
            {
                return xml;
            }

            return serialize(o, o.GetType());
        }

        /// <summary>
        /// 把對象轉換成xml
        /// </summary>
        /// <param name="o"></param>
        /// <param name="type">指定對象類型</param>
        /// <returns></returns>
        public static string serialize(object o, Type type)
        {
            var xml = "";
            if (o == null)
            {
                return xml;
            }

            //序列化對象
            XmlSerializer serializer = new XmlSerializer(type);
            // 輸出
            Stream stream = new MemoryStream();
            serializer.Serialize(stream, o);
            stream.Position = 0;
            StreamReader sr = new StreamReader(stream);
            xml = sr.ReadToEnd();
            sr.Dispose();
            sr.Close();

            stream.Dispose();
            stream.Close();

            return xml;
        }

        /// <summary>
        /// 反序化xml爲對象
        /// </summary>
        /// <param name="xml"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public static object deserialize(string xml, Type type)
        {
            try
            {
                using (StringReader sr = new StringReader(xml))
                {
                    XmlSerializer serializer = new XmlSerializer(type);
                    return serializer.Deserialize(sr);
                }
            }
            catch (Exception e)
            {
                return null;
            }
        }
    }

 

,在使用時可如下操作:

//對象定義
[XmlRoot("DocumentElement")]
    public class DocumentElement
    {
        //[XmlArray("DataTables"), XmlArrayItem("DataTable")] //DataTables內包含DataTable
        [XmlElement("DataTable")] //DataTable平行出現,不出現data
        public List<MyDataTable> data { get; set; }
    }

    [XmlRoot("DataTable")]//在xml文本需要DataTable爲節點名,但DataTable又是C#關鍵字的時候
    public class MyDataTable
    {
        [XmlElement(IsNullable = true)]
        public string oper { get; set; }
        [XmlElement(IsNullable = true)]
        public string gcode { get; set; }
        [XmlElement(IsNullable = true)]
        public string charge_code { get; set; }
        [XmlElement(IsNullable = true)]
        public string gname { get; set; }
        [XmlElement(IsNullable = true)]
        public string gname1 { get; set; }
        [XmlElement(IsNullable = true)]
        public string spn { get; set; }
        [XmlElement(IsNullable = true)]
        public string produrceid { get; set; }
        [XmlElement(IsNullable = true)]
        public string produrce { get; set; }
        [XmlElement(IsNullable = true)]
        public string unit { get; set; }
        [XmlElement(IsNullable = true)]
        public string caseunit { get; set; }
        [XmlElement(IsNullable = true)]
        public string pack { get; set; }
        [XmlElement(IsNullable = true)]
        public string zjm { get; set; }
        [XmlElement(IsNullable = true)]
        public string status { get; set; }
        public decimal price { get; set; }
        public decimal price1 { get; set; }
        [XmlElement(IsNullable=true)]
        public string zbh { get; set; }

    }
//測試序列化
            var xml = "";
            DocumentElement de = new DocumentElement();


            var mdt = new MyDataTable();
            mdt.caseunit = "";
            mdt.charge_code = "X24538";

            var mdt2 = new MyDataTable();
            mdt2.caseunit = "";
            mdt2.charge_code = "X24538";

            de.data = new List<MyDataTable>();
            de.data.Add(mdt);
            de.data.Add(mdt2);

            xml = XmlHelper.serialize(de);
            Console.WriteLine(xml);    

,接下來可以測試xml字符串轉換成類對象

先輸入xml文件,XMLFile1.xml的內容:

<?xml version="1.0" encoding="utf-8" ?>
<DocumentElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DataTable>
    <oper xsi:nil="true" />
    <gcode xsi:nil="true" />
    <charge_code>X24538</charge_code>
    <gname xsi:nil="true" />
    <gname1 xsi:nil="true" />
    <spn xsi:nil="true" />
    <produrceid xsi:nil="true" />
    <produrce xsi:nil="true" />
    <unit xsi:nil="true" />
    <caseunit></caseunit>
    <pack xsi:nil="true" />
    <zjm xsi:nil="true" />
    <status xsi:nil="true" />
    <price>0</price>
    <price1>0</price1>
    <zbh xsi:nil="true" />
  </DataTable>
  <DataTable>
    <oper xsi:nil="true" />
    <gcode xsi:nil="true" />
    <charge_code>X24538</charge_code>
    <gname xsi:nil="true" />
    <gname1 xsi:nil="true" />
    <spn xsi:nil="true" />
    <produrceid xsi:nil="true" />
    <produrce xsi:nil="true" />
    <unit xsi:nil="true" />
    <caseunit></caseunit>
    <pack xsi:nil="true" />
    <zjm xsi:nil="true" />
    <status xsi:nil="true" />
    <price>0</price>
    <price1>0</price1>
    <zbh xsi:nil="true" />
  </DataTable>
</DocumentElement>

測試反序化:

var content = File.ReadAllText(Environment.CurrentDirectory + @"\XMLFile1.xml");
            DocumentElement de = XmlHelper.deserialize(content, typeof(DocumentElement)) as DocumentElement;
            if (de != null)
            {
                var length = de.data.Count;
                //Console.WriteLine(de.data[length-1].charge_code);
                foreach (var item in de.data)
                {
                    Console.WriteLine(item.charge_code);
                }
            }

關於參數的說明:

1. [XmlArray("DataTables"), XmlArrayItem("DataTable")] //DataTables內包含DataTable
默認情況下,集合數據在轉換爲xml字符串時,是父級DataTables包含子集DataTable的形式,如:<DataTables><DataTable>?</DataTable><DataTable>?</DataTable>...</DataTables>
1. [XmlElement("DataTable")] //DataTable平行出現,
當不需要顯示父級DataTables這個字段時,用這種方式註釋,DataTable平行出現,如:<DataTable>?</DataTable><DataTable>?</DataTable><DataTable>?</DataTable><DataTable>?</DataTable>...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章