天天看點

xml檔案的序列化 和反序列化

  最近在做一個項目中用到了一些分布式的東西 需要進行資料互動 資料互動使用xml檔案 單獨的使用xml檔案 進行組成和解析式比較麻煩的 我們可以先寫實體 然後序列化為一個xml檔案發送 接收資料時 我們可以反序列化 将一個xml檔案反序列化為一個實體.

實體的定義:

[Serializable]

    public class header

    {

        [XmlElement]

        public string agentID;

        [XmlElement]

        public string timestamp;

        [XmlElement]

        public int tradeType;

    }

首先 需要[Serializable]标示 保證被序列化,剩下的和我們平時寫的實體沒什麼差別 唯一的是要在屬性上面加上   [XmlElement] 表明這是一個節點

實體的定義:

[Serializable]

    public class agentOrder

    {

        [XmlAttribute]

        public string ID;

        [XmlAttribute]

        public string lotteryID;

        [XmlAttribute]

        public string code;

        [XmlAttribute]

        public string JKCStartTime;

        [XmlAttribute]

        public string JKCEndTime;

        [XmlElement(Type = typeof(orderItem))]

        public List<orderItem> orderItem;

    }

如果需要在一個節點中定義屬性 我們可以在屬性上面标示    [XmlAttribute]  如果在該節點下面還有節點 我們可以使用最後一行的寫法

        [XmlText]

        public string ticketCode;

當然 還有這樣的寫法 标示屬性的内容是寫在外面的

最後 是最關鍵的關于序列化 和反序列化的工具類:

public class XmlUtil

    {

        /// <summary>

        /// 類序列化

        /// </summary>

        /// <param name="obj"></param>

        /// <param name="isIndented"></param>

        /// <returns></returns>

        public static string XmlSerialization(object obj, bool isIndented)

        {

            if (obj == null)

            {

                return "";

            }

            XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();

            xmlns.Add(String.Empty, String.Empty);

            XmlSerializer formatter = new XmlSerializer(obj.GetType());

            MemoryStream stream = new MemoryStream();

            UTF8Encoding utf8 = new UTF8Encoding(false);

            XmlTextWriter writer = new XmlTextWriter(stream, utf8);

            string xml;

            try

            {

                writer.Formatting = isIndented ? Formatting.None : Formatting.Indented;

                formatter.Serialize(writer, obj, xmlns);

                xml = utf8.GetString(stream.ToArray());

            }

            finally

            {

                writer.Flush();

                writer.Close();

                stream.Close();

            }

            return xml;

        }

        /// <summary>

        ///類反序列化

        /// </summary>

        /// <param name="type"></param>

        /// <param name="xml"></param>

        /// <returns></returns>

        public static object DeXmlSerialization(Type type, string xml)

        {

            if (xml == null)

            {

                return null;

            }

            else if (xml == "")

            {

                return null;

            }

            XmlSerializer formatter = new XmlSerializer(type);

            StringReader reader = new StringReader(xml);

            XmlTextReader xreader = new XmlTextReader(reader);

            object obj;

            try

            {

                obj = formatter.Deserialize(xreader);

            }

            catch (Exception ex)

            {

                obj = null;

            }

            finally

            {

                reader.Close();

            }

            return obj;

        }