C# 序列化(Serialize)與反序列化(Deserialize)

序列化又稱串行化,是.NET運行時環境用來支持用戶定義類型的流化的機制。其目的是以某種存儲形成使自定義對象持久化,或者將這種對象從一個地方傳輸到另一個地方。

.NET框架提供了兩種串行化的方式:

1、是使用BinaryFormatter進行串行化;

2、使用XmlSerializer進行串行化。

第一種方式提供了一個簡單的二進制數據流以及某些附加的類型信息,而第二種將數據流格式化爲XML存儲。    可以使用[Serializable]屬性將類標誌爲可序列化的。如果某個類的元素不想被序列化:

1、可以使用[NonSerialized]屬性來標誌

2、可以使用[XmlIgnore]來標誌。

序列化意思指的是把對象的當前狀態進行持久化,一個對象的狀態在面向對象的程序中是由屬性表示的,所以序列化類的時候是從屬性讀取值以某種格式保存下來,而類的成員函數不會被序列化,.net存在幾種默認提供的序列化,二進制序列化,xml和json序列化會序列化所有的實例共有屬性。

1.BinaryFormatter  二進制序列化

命名空間:System.Runtime.Serialization.Formatters.Binary;
2、使用XmlSerializer進行串行化
    關於格式化器還有一個問題,假設我們需要XML,有兩中方案:要麼編寫一個實現IFormatter接口的類,採用的方式類似於SoapFormatter類,但是沒有你不需要的信息;要麼使用庫類XmlSerializer,這個類不使用Serializable屬性,但是它提供了類似的功能。
    如果我們不想使用主流的串行化機制,而想使用XmlSeralizer進行串行化我們需要做一下修改:
    a.添加System.Xml.Serialization命名空間。
    b.Serializable和NoSerialized屬性將被忽略,而是使用XmlIgnore屬性,它的行爲與NoSerialized類似。
    c.XmlSeralizer要求類有個默認的構造器,這個條件可能已經滿足了。

序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
xs.Serialize(fs, listPers);
反序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
List<Peoson> list = xs.Deserialize(fs) as List<Peoson>;

代碼:
1.Model類

 [Serializable]
    [XmlRoot("Person")]
    public class Person
    {
        private String name;
        [XmlAttribute("Name")]
        public String Name
        {
            get { return name; }
            set { name = value; }
        }
        //[NonSerialized]
        private Int32 age;

        [XmlAttribute("Age")]
        public Int32 Age
        {
            get { return age; }
            set { age = value; }
        }
        public Person()
        { 
        }
        public Person(String name, Int32 age)
        {
            this.name = name;
            this.age = age;
        }

        public void SayHello()
        {
            Console.WriteLine(String.Format("大家好,我是{0},今年{1}歲", name, age));
        }
    }

2.Main函數

  static void Main(string[] args)
        {
            List<Person> listPerson = new List<Person>();
            listPerson.Add(new Person("zhangsan", 18));
            listPerson.Add(new Person("lisi", 20));

            //serializeMethod(listPerson);

            //reserializeMethod();

            xmlSerializeMethod(listPerson);
            XmlReserializeMethod();
            Console.ReadKey();
        }

3.序列化方法封裝

  public static void serializeMethod(List<Person> persons)
        {
            using (FileStream fs = new FileStream("1.bin", FileMode.Create))
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(fs, persons);
            }
        }

        public static void reserializeMethod()
        {
            using (FileStream fs = new FileStream("1.bin", FileMode.Open))
            {
                BinaryFormatter bf = new BinaryFormatter();
                List<Person> listPerson = bf.Deserialize(fs) as List<Person>;
                if (listPerson != null)
                {
                    for (int i = 0; i < listPerson.Count; i++)
                    {
                        listPerson[i].SayHello();
                    }
                }

            }
        }


        /// <summary>
        /// 序列化一個泛型列表到xml
        /// </summary>
        /// <param name="listPers"></param>
        public static void xmlSerializeMethod(List<Person> listPers)
        { 
            using(FileStream fs=new FileStream("1.xml",FileMode.Create))
            {
                XmlSerializer xs = new XmlSerializer(typeof(List<Person>));
                xs.Serialize(fs, listPers);

                Console.WriteLine("1.xml" + "序列化文件成功");
            }
        }
        /// <summary>
        /// 反序列化一個xml到泛型列表
        /// </summary>
        public static void XmlReserializeMethod()
        {
            using(FileStream fs=new FileStream("1.xml",FileMode.Open))
            {
                XmlSerializer xs = new XmlSerializer(typeof(List<Person>));
                List<Person> listpers = xs.Deserialize(fs) as List<Person>;
                if (listpers != null)
                {
                    for (int i = 0; i < listpers.Count; i++)
                    {
                        listpers[i].SayHello();
                    }
                }
                
            }
        }

     
        /// <summary>
        /// 序列化一個類的實例
        /// </summary>
        /// <param name="p"></param>
        public static void xmlSerializeMethod(Person p)
        {
            using (FileStream fs = new FileStream("1.xml", FileMode.Create))
            {
                XmlSerializer xs = new XmlSerializer(typeof(Person));
                xs.Serialize(fs, p);

                Console.WriteLine("1.xml" + "序列化文件成功");
            }

        }

 

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