C#序列化與反序列化。


序列化介紹:

把對象用一種新的格式來表示。

系列化只序列化數據。

序列化不建議使用自動屬性

為什么要序列化:

將一個復雜的對象轉換流,方便存儲與信息交換。

class Program
    {      
        static void Main(string[] args)
        {
            Person person = new Person();
            person.Name = "張三";
            person.Age = 18;
            // json 序列化   變成字符串
            JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
            string msg = javaScriptSerializer.Serialize(person);
            Console.WriteLine(msg);
        }    
    }
    class Person
    {
        public string Name { get; set; }
        public  int Age { get; set; }
    }

二進制序列化:

就是將對象變成流的過程,把對象變成byte[ ]。

class Program
    {      
        static void Main(string[] args)
        {
            Person person = new Person();
            person.Name = "張三";
            person.Age = 18;
            // 二進制序列化注意點:
            //1、被序列化對象類型必須標記為可序列化
            //2、被序列化的所有父類也必須標記為可序列化
            //3、被序列化的對象的類型中字段的類型也要標記

            //二進制序列化步驟:
            //1、創建序列化器
            BinaryFormatter bf = new BinaryFormatter();
            // 1.1 創建一個文件流。
            using(FileStream fsWrite =new FileStream("person.bin", FileMode.Create))
            {
                //2、開始執行序列化。
                bf.Serialize(fsWrite, person);
            }
            Console.WriteLine("序列化完畢");
            
        }    
    }
    [Serializable]
    class Person:Animal
    {
        public string Name { get; set; }
        public  int Age { get; set; }
        public Car BenChi { get; set; }
    }
    [Serializable]
    public class Animal
    {
        public  void Eat()
        {
            Console.WriteLine("eat food...");
        }
    }
    [Serializable]
    public class Car
    {

    }

反序列化:

 class Program
    {      
        static void Main(string[] args)
        {
             //二進制反序列化注意的問題:
             //1、必須獲取被系列化的對象的類型所在的程序集。因為它要根據序列化文件還原該對象,而序列化文件中
             //只包含數據信息,而不包含其類型的相關信息、方法相關信息等,這些信息在對象序列文件中都沒有。

            //步驟:
            //1、創建序列化器。
            BinaryFormatter bf = new BinaryFormatter();
            //1.1 創建讀取文件的文件流。
            using(FileStream fsRead=new FileStream("person.bin", FileMode.Open))
            {
                //2、執行反序列化。
                object obj = bf.Deserialize(fsRead);
                Person person = (Person)obj;
                Console.WriteLine(person.Name);
            }
            Console.WriteLine("ok");
             
            
        }    
    }
    [Serializable]
    class Person
    {
        public string Name { get; set; }
        public  int Age { get; set; }
    }

 練習:添加對象到array list中,進行序列化和反序列化。

序列化:

class Program
    {      
        static void Main(string[] args)
        {
            ArrayList arrayList = new ArrayList();
            arrayList.Add("張三");
            arrayList.Add(18);
            //創建序列化容器
            BinaryFormatter bf = new BinaryFormatter();
            //創建文件流
            using(FileStream fs=new FileStream("txt.txt", FileMode.Create))
            {
                //執行序列化
                bf.Serialize(fs, arrayList);
            }
            Console.WriteLine("序列化完畢");
            
        }    
    }

反序列化:

class Program
    {      
        static void Main(string[] args)
        {
            //創建序列化容器
            BinaryFormatter bf = new BinaryFormatter();
            //創建讀取的文件流
            using(FileStream fs=new FileStream("txt.txt", FileMode.Open))
            {
                //執行反序列化
               object obj= bf.Deserialize(fs);
                ArrayList arrayList = (ArrayList)obj;
                foreach (var item in arrayList)
                {
                    Console.WriteLine(item);
                }
            }
           
            
        }    
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM