您现在的位置是:主页>文章>C# 序列化和反序列化 网站首页

C# 序列化和反序列化

1.什么是序列化和反序列化

    序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。C#反序列化就是在需要的时候再把这个文件转化成原来的对象使用。

2.序列化的类型

  • 二进制(流)序列化(使用BinaryFormatter序列化器)

  • SOAP序列化(使用SoapFormatter序列化器)

  • XML序列化(使用XmlSerializer序列化器)

    二进制格式可序列化一个类型的所有可序列化字段,不管它是公共字段还是私有字段。SOAP格式和XML格式仅能序列化公共字段或拥有公共属性的私有字段,未通过属性公开的私有字段将被忽略。 

3.具体例子

     3.1二进制(流)序列化  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace SerializeDemo
{
    [Serializable]  //必须添加序列化特性
    public class Person
    {
        //姓名
        public string Name;
        //性别
        public string Sex;
        //年龄
        public int Age;
         //必须提供无参构造器,否则XmlSerializer将出错
        public Person() { }
         //构造函数
        public Person(string name, string sex,int age)
        {
            this.Name = name;
            this.Sex = sex;
            this.Age = age;
        }
    }
    class Program
    {
        static string strFile = "c:\\person.data";
        static void Main(string[] args)
        {
            Person person = new Person { Name = "mcalvin", Sex = "男", Age = 22 };
            Serialize(person);
            Person dePerson = new Person();
            dePerson = DeSerialize();
            Console.WriteLine("姓名:" + dePerson.Name);
            Console.WriteLine("性别:" + dePerson.Sex);
            Console.WriteLine("年龄:" + dePerson.Age);
        }
        public static void Serialize(Person person)
        {
            using (FileStream fs = new FileStream(strFile, FileMode.Create))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(fs, person);
            }
        }
        public static Person DeSerialize()
        {
            Person person;
            using (FileStream fs = new FileStream(strFile, FileMode.Open))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                person = (Person)formatter.Deserialize(fs);
            }
            return person;
        }
    }
}


 3.2 SOAP序列化

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Soap;
using System.IO;
namespace SerializeDemo
{
    [Serializable]  //必须添加序列化特性
    public class Person
    {
        //姓名
        public string Name;
        //性别
        public string Sex;
        //年龄
        public int Age;
         //必须提供无参构造器,否则XmlSerializer将出错
        public Person() { }
         //构造函数
        public Person(string name, string sex,int age)
        {
            this.Name = name;
            this.Sex = sex;
            this.Age = age;
        }
    }
    class Program
    {
        static string strFile = "c:\\person.soap";
        static void Main(string[] args)
        {
            Person person = new Person { Name = "mcalvin", Sex = "男", Age = 22 };
            Serialize(person);
            Person dePerson = new Person();
            dePerson = DeSerialize();
            Console.WriteLine("姓名:" + dePerson.Name);
            Console.WriteLine("性别:" + dePerson.Sex);
            Console.WriteLine("年龄:" + dePerson.Age);
        }
        public static void Serialize(Person person)
        {
            using (FileStream fs = new FileStream(strFile, FileMode.Create))
            {
                SoapFormatter formatter = new SoapFormatter();
                formatter.Serialize(fs, person);
            }
        }
        public static Person DeSerialize()
        {
            Person person;
            using (FileStream fs = new FileStream(strFile, FileMode.Open))
            {
                SoapFormatter formatter = new SoapFormatter();
                person = (Person)formatter.Deserialize(fs);
            }
            return person;
        }
    }
}


 3.3 XML序列化

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;
namespace SerializeDemo
{
    [Serializable]  //必须添加序列化特性
    public class Person
    {
        //姓名
        public string Name;
        //性别
        public string Sex;
        //年龄
        public int Age;
         //必须提供无参构造器,否则XmlSerializer将出错
        public Person() { }
         //构造函数
        public Person(string name, string sex,int age)
        {
            this.Name = name;
            this.Sex = sex;
            this.Age = age;
        }
    }
    class Program
    {
        static string strFile = "c:\\person.xml";
        static void Main(string[] args)
        {
            Person person = new Person { Name = "mcalvin", Sex = "男", Age = 22 };
            Serialize(person);
            Person dePerson = new Person();
            dePerson = DeSerialize();
            Console.WriteLine("姓名:" + dePerson.Name);
            Console.WriteLine("性别:" + dePerson.Sex);
            Console.WriteLine("年龄:" + dePerson.Age);
        }
        public static void Serialize(Person person)
        {
            using (FileStream fs = new FileStream(strFile, FileMode.Create))
            {
                XmlSerializer formatter = new XmlSerializer(typeof(Person));
                formatter.Serialize(fs, person);
            }
        }
        public static Person DeSerialize()
        {
            Person person;
            using (FileStream fs = new FileStream(strFile, FileMode.Open))
            {
                XmlSerializer formatter = new XmlSerializer(typeof(Person));
                person = (Person)formatter.Deserialize(fs);
            }
            return person;
        }
    }
}


 

上一篇:ELK 监控搭建;

下一篇:C# 6.0那些事;

Top