C#-二進制和XML序列化

序列化:就是把一個對象轉換爲可以保存的形式,以便於保持或者傳輸。
有兩種方式:
1.
二進制序列化:可以保持一個對象所有的數據,對於在應用程序的不同調用之間保留對象的狀態很有用。
2.XML
序列化:僅序列化公共屬性和字段,而且不保留類型信息。但是XML是開放的標準,所有要在不同的系統之間

共享數據,是個很好的選擇。

. 實現二進制最簡單的方法就是把類標記爲Serializable

usingSystem;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace_06_04
{
    [Serializable]
    public class MyClass
    {
        public string Name;
        private int age;
        private double height;

       public MyClass(int Age, double Height)
        {
            this.age =Age;
            this.height= Height;
        }

       public int Age
        {
            get
            {
               return age;
            }
        }

       public double Height
        {
            get
            {
               return height;
            }
        }
    }

   public class class_06_04
    {
        public static void Main()
        {
            MyClass me =new MyClass(24, 1.76);
            me.Name ="Fei";
           BinaryFormatter formatter = new BinaryFormatter();
            Streamstream = new FileStream("MyFile.txt", FileMode.Create,FileAccess.Write,

FileShare.None);
           formatter.Serialize(stream, me);
           stream.Close();

           stream = new FileStream("MyFile.txt",FileMode.Open);
            MyClassmetoo = (MyClass)formatter.Deserialize(stream);
           stream.Close();

           Console.WriteLine("我是{0}", metoo.Name);
           Console.WriteLine("
我的年齡是{0}", metoo.Age);
           Console.WriteLine("
我的身高是{0}",metoo.Height);

           Console.ReadLine();
        }
    }
}

 

二:使用XmlSerializer進行序列化

usingSystem;
using System.IO;
using System.Runtime.Serialization;
//using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;

namespace_06_04
{
    [Serializable]
    public class MyClass
    {
        public string Name;
        private int age;
        private double height;

       public MyClass()
        { }

       public MyClass(int Age, double Height)
        {
            this.age =Age;
            this.height= Height;
        }

       public int Age
        {
            get
            {
               return age;
            }
        }

       public double Height
        {
            get
            {
               return height;
            }
        }
    }

   public class Class_06_04
    {
        public static void Main()
        {
            MyClass me =new MyClass(24, 1.76);
            me.Name ="Fei";

           XmlSerializer srl = new XmlSerializer(typeof(MyClass));
            StreamWriterwrt = new StreamWriter("MyFile.xml");
           srl.Serialize(wrt, me);
            wrt.Close();

           StreamReader rdr = new StreamReader("MyFile.xml");
            MyClassnotme = (MyClass)srl.Deserialize(rdr);
            rdr.Close();

            Console.WriteLine("我是{0}", notme.Name);
            Console.WriteLine("
我的年齡是{0}", notme.Age);
            Console.WriteLine("
我的身高是{0}", notme.Height);

            Console.ReadLine();
        }
    }
}
輸出結果
我是 Fei
我的年齡 0
我的身高 0

這其中只有public字段Name被成功的序列化和反序列化,其餘兩個字段都沒有成功。

. 我們可以使用Attribute來對序列化進行一些控制,可以控制一個字段是否被序列化,不過無法讓

XmlSerializer序列化非public字段。

usingSystem;
using System.IO;
using System.Runtime.Serialization;
//using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;


namespace _06_04
{
    [Serializable]
    public class MyClass
    {
        public string Name;

       [XmlElement(ElementName = "MyAge")] 
        public int Age;
    }

   public class Class_06_04
    {
        public static void Main()
        {
            MyClass me =new MyClass();
            me.Name ="Fei";
            me.Age = 19;

           XmlSerializer srl = new XmlSerializer(typeof(MyClass));
            StreamWriterswr = new StreamWriter("MyFile1.xml");
           srl.Serialize(swr, me);
            swr.Close();
        }
    }
}

打開xml可以看到
  <?xml version="1.0" encoding="utf-8" ?>
- <MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Fei</Name>
  <MyAge>19</MyAge>
  </MyClass>

其中Age字段的名字在xml中變成了MyAge了。

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