C# XML序列化和反序列化

原文:http://www.cnblogs.com/nhxy/archive/2010/11/16/1878409.html

本文描述如何使用CLR中的StringWriter,XmlSerializer將對象, 對象集合序列化爲Xml格式的字符串, 同時描述如何進行反序列化。看代碼就能理解,直接上代碼了:

案例1:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.IO;  
using System.Xml;  
using System.Xml.Serialization;  

namespace ConsoleApplication1  
{  
    class SimpleSerializer  
    {  
        /// <summary>  
        /// 序列化對象  
        /// </summary>  
        /// <typeparam name="T">對象類型</typeparam>  
        /// <param name="t">對象</param>  
        /// <returns></returns>  
        public static string Serialize<T>(T t)  
        {  
            using (StringWriter sw = new StringWriter())  
            {  
                XmlSerializer xz = new XmlSerializer(t.GetType());  
                xz.Serialize(sw, t);  
                return sw.ToString();  
            }  
        }  

        /// <summary>  
        /// 反序列化爲對象  
        /// </summary>  
        /// <param name="type">對象類型</param>  
        /// <param name="s">對象序列化後的Xml字符串</param>  
        /// <returns></returns>  
        public static object Deserialize(Type type, string s)  
        {  
            using (StringReader sr = new StringReader(s))  
            {  
                XmlSerializer xz = new XmlSerializer(type);  
                return xz.Deserialize(sr);  
            }  
        }  
    }  
}  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Xml.Serialization;  

namespace ConsoleApplication1  
{  
    [Serializable]  
    public class UserInfo  
    {  
        private int m_UserId;  
        [XmlElement("userId")]  
        public int UserId  
        {  
            get { return m_UserId; }  
            set { m_UserId = value; }  
        }  

        private string m_UserName;  
        [XmlElement("userName")]  
        public string UserName  
        {  
            get { return m_UserName; }  
            set { m_UserName = value; }  
        }  
    }  
}  
using System;  
using System.Collections.Generic;  

namespace ConsoleApplication1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            TestOne();  
            Console.WriteLine();  
            TestTwo();  
            Console.WriteLine();  
            TestThree();  
            Console.WriteLine();  
            TestFour();  
            Console.ReadLine();  
        }  

        public static void TestOne()  
        {  
            UserInfo info = new UserInfo() { UserId = 1, UserName = "Guozhijian" };  
            Console.WriteLine(SimpleSerializer.Serialize<UserInfo>(info));  
        }  

        public static void TestTwo()  
        {  
            List<UserInfo> list = new List<UserInfo>();  
            list.Add(new UserInfo() { UserId = 1, UserName = "Guozhijian" });  
            list.Add(new UserInfo() { UserId = 2, UserName = "Zhenglanzhen" });  
            Console.WriteLine(SimpleSerializer.Serialize<List<UserInfo>>(list));  
        }  

        public static void TestThree()  
        {  
            string s = SimpleSerializer.Serialize<UserInfo>(new UserInfo() { UserId = 1, UserName = "Guozhijian" });  
            UserInfo info = SimpleSerializer.Deserialize(typeof(UserInfo), s) as UserInfo;  
            Console.WriteLine(info.UserId.ToString() + ", " + info.UserName);  
        }  

        public static void TestFour()  
        {  
            List<UserInfo> list = new List<UserInfo>();  
            list.Add(new UserInfo() { UserId = 1, UserName = "Guozhijian" });  
            list.Add(new UserInfo() { UserId = 2, UserName = "Zhenglanzhen" });  

            string s = SimpleSerializer.Serialize<List<UserInfo>>(list);  
            List<UserInfo> newList = SimpleSerializer.Deserialize(typeof(List<UserInfo>), s) as List<UserInfo>;  
            foreach (var info in newList)  
            {  
                Console.WriteLine(info.UserId.ToString() + ", " + info.UserName);  
            }  
        }  
    }  
}  

運行結果:
運行結果

案例2:

using System;  
using System.Collections.Generic;  
using System.Text;  

namespace SimpleSerialize  
{  
    [Serializable]  
    public class Radio  
    {  
        public bool hasTweeters;  
        public bool hasSubWoofers;  
        public double[] stationPresets;  

        [NonSerialized]  
        public string radioID = "XF-552RR6";  
    }  
}  
[Serializable]
    public class Car
    {
        public Radio theRadio = new Radio();
        public bool isHatchBack;
    }

    [Serializable, XmlRoot(Namespace = "http://www.intertech.com")]
    public class JamesBondCar : Car
    {
        [XmlAttribute] public bool canFly;
        [XmlAttribute] public bool canSubmerge;

        public JamesBondCar(bool skyWorthy, bool seaWorthy)
        {
            canFly = skyWorthy;
            canSubmerge = seaWorthy;
        }

        // The XmlSerializer demands a default constructor!  
        public JamesBondCar()
        {
        }
    }
using System;  
using System.Collections.Generic;  
using System.Text;  
using System.IO;  
using System.Runtime.Serialization.Formatters.Binary;  
using System.Runtime.Serialization.Formatters.Soap;  
using System.Xml.Serialization;  

namespace SimpleSerialize  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Console.WriteLine("***** Fun with Object Serialization *****\n");  

            // Make a JamesBondCar and set state.  
            JamesBondCar jbc = new JamesBondCar();  
            jbc.canFly = true;  
            jbc.canSubmerge = false;  
            jbc.theRadio.stationPresets = new double[] { 89.3, 105.1, 97.1 };  
            jbc.theRadio.hasTweeters = true;  

            // Now save / Load the car to a specific file.  
            SaveAsBinaryFormat(jbc, "CarData.dat");  
            LoadFromBinaryFile("CarData.dat");  
            SaveAsSoapFormat(jbc, "CarData.soap");  
            SaveAsXmlFormat(jbc, "CarData.xml");  
            SaveListOfCars();  
            SaveListOfCarsAsBinary();  

            LoadAsXmlFormat(jbc, "CarData.xml");  
            Console.ReadLine();  
        }  

        #region Save / Load as Binary Format  
        static void SaveAsBinaryFormat(object objGraph, string fileName)  
        {  
            // Save object to a file named CarData.dat in binary.  
            BinaryFormatter binFormat = new BinaryFormatter();  

            using (Stream fStream = new FileStream(fileName,  
                  FileMode.Create, FileAccess.Write, FileShare.None))  
            {  
                binFormat.Serialize(fStream, objGraph);  
            }  
            Console.WriteLine("=> Saved car in binary format!");  
        }  

        static void LoadFromBinaryFile(string fileName)  
        {  
            BinaryFormatter binFormat = new BinaryFormatter();  

            // Read the JamesBondCar from the binary file.  
            using (Stream fStream = File.OpenRead(fileName))  
            {  
                JamesBondCar carFromDisk =  
                  (JamesBondCar)binFormat.Deserialize(fStream);  
                Console.WriteLine("Can this car fly? : {0}", carFromDisk.canFly);  
            }  
        }  
        #endregion  

        #region Save as SOAP Format  
        // Be sure to import System.Runtime.Serialization.Formatters.Soap   
        // and reference System.Runtime.Serialization.Formatters.Soap.dll.  
        static void SaveAsSoapFormat(object objGraph, string fileName)  
        {  
            // Save object to a file named CarData.soap in SOAP format.  
            SoapFormatter soapFormat = new SoapFormatter();  

            using (Stream fStream = new FileStream(fileName,  
              FileMode.Create, FileAccess.Write, FileShare.None))  
            {  
                soapFormat.Serialize(fStream, objGraph);  
            }  
            Console.WriteLine("=> Saved car in SOAP format!");  
        }  
        #endregion  

        #region Save as XML Format  
        static void SaveAsXmlFormat(object objGraph, string fileName)  
        {  
            // Save object to a file named CarData.xml in XML format.  
            XmlSerializer xmlFormat = new XmlSerializer(typeof(JamesBondCar),  
              new Type[] { typeof(Radio), typeof(Car) });  

            using (Stream fStream = new FileStream(fileName,  
              FileMode.Create, FileAccess.Write, FileShare.None))  
            {  
                xmlFormat.Serialize(fStream, objGraph);  
            }  
            Console.WriteLine("=> Saved car in XML format!");  
        }  
        #endregion  

        #region Load as XML Format  
        static void LoadAsXmlFormat(object objGraph, string fileName)  
        {  
            XmlSerializer a = new XmlSerializer(objGraph.GetType());  
            using (StreamReader fStream = new StreamReader(fileName))  
            {  
                JamesBondCar b = a.Deserialize(fStream) as JamesBondCar;  
                Console.WriteLine("=> Loaded car in XML format!");  
                Console.WriteLine("Can this car fly? : {0}", b.canFly);  
            }  
        }  
        #endregion  

        #region Save collection of cars  
        static void SaveListOfCars()  
        {  
            // Now persist a List<> of JamesBondCars.  
            List<JamesBondCar> myCars = new List<JamesBondCar>();  
            myCars.Add(new JamesBondCar(true, true));  
            myCars.Add(new JamesBondCar(true, false));  
            myCars.Add(new JamesBondCar(false, true));  
            myCars.Add(new JamesBondCar(false, false));  

            using (Stream fStream = new FileStream("CarCollection.xml",  
              FileMode.Create, FileAccess.Write, FileShare.None))  
            {  
                XmlSerializer xmlFormat = new XmlSerializer(typeof(List<JamesBondCar>),  
                  new Type[] { typeof(JamesBondCar), typeof(Car), typeof(Radio) });  
                xmlFormat.Serialize(fStream, myCars);  
            }  
            Console.WriteLine("=> Saved list of cars!");  
        }  

        static void SaveListOfCarsAsBinary()  
        {  
            // Save ArrayList object (myCars) as binary.  
            List<JamesBondCar> myCars = new List<JamesBondCar>();  

            BinaryFormatter binFormat = new BinaryFormatter();  
            using (Stream fStream = new FileStream("AllMyCars.dat",  
              FileMode.Create, FileAccess.Write, FileShare.None))  
            {  
                binFormat.Serialize(fStream, myCars);  
            }  
            Console.WriteLine("=> Saved list of cars in binary!");  
        }  
        #endregion  
    }  
}  

運行結果:
運行結果


好了,祝進步。

每天進步一點點。

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