序列化是将对象状态转换为可保持(保存)或传输的形式的过程。序列化的补集是反序列化,后者将流转换为对象。这两个过程就是保证数据易于存储和传输
     .NETFramework提供两个序列化技术:
  1、二进制序列化保持类型保真,这对于多次调用应用程序是保持对象状态非常有用。
  2.、XML序列化只序列公共属性和字段,并且不保持类型保真。

二进制序列化:可以将序列化定义为一个将对象状态存储到存储介质的过程,在转化的过程就是将公共字段和私有字段及类的名称,转换成字节流,字节流接着写入到数据流。反序列化就是将序列化反转回来。

在进行序列化时要引入两个命名空间:
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
//序列化类
[Serializable]
public class Person
{
  private string name;
  public string Name
     {
         get { return name; }
         set { name = value; }
      }
  public int Age;
  public bool Sex
   {
     get;set;
    } 

}
   //序列化函数
   static void XLH()
        {
            Person person = new Person();
            person.Name = "asdas";
            person.Age = 90;
            person.Sex = true;
            IFormatter formatter = new BinaryFormatter();//序列化格式
            Stream stream = new FileStream(@"D:\MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);//把对象数据写入到数据流中
            formatter.Serialize(stream, person);//序列化把对象图形数据写成相对应的数据流
            stream.Close();
        }
      //反序列化函数
      static void FXLH()
        {
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream(@"D:\MyFile.bin",FileMode .Open ,FileAccess .Read ,FileShare .Read );//把数据写入到数据流中
            Person person = (Person )formatter.Deserialize(stream);//反序列把数据流写成相对应的对象图像
            stream.Close();
            Console.WriteLine(string .Format ("年龄:{0},性别:{1},名字:{2}",person .Age ,person.Sex  ,person .Name ));
        }

选择序列化

[Serializable]
public class Person
{
  private string name;
  public string Name
     {
         get { return name; }
         set { name = value; }
      }
  [NonSerialized]//选择序列化,就是方法不能调用Age字段
  public int Age;
  public bool Sex
   {
     get;set;
    } 

}

 自定义序列化

 自定义序列化是控制理性的序列化和反序列化的过程,通过控制序列化,尅确保序列化兼容性。

   public class Person
    {
        public bool sex;
    }
    [Serializable]
    public class Chinese : Person
    {
        public string complexion;
    }
如果像这样在子类中有序列化,父类中没有序列化Main方法中调用有可能会出现错误,

如果在子类继承父类的同时加上ISerializable接口就可以避免这样的错误
ISerializable接口可以使父类序列化
[Serializable]
public class Chinese : Person,ISerializable (让父类序列化)
    {
        public string complexion;
        public Chinese()
        { }
        public Chinese(SerializationInfo info, StreamingContext context)
        {
            sex = info.GetBoolean("sex");
            complexion = info.GetString("complexion");
        }

实现ISerializable涉及到实现GetObjectData方法以及反序列化对象是所用的特殊构造函数,强调何时将ISerializable添加至必须同时实现GetObjectData和特殊构造函数的某个类,这一点很重要。如果缺少GetObjectData,编译器会发出警告。但是,鉴于无法强制实现构造函数,如果不存在该构造函数,则不会发出任何警告,但此时如果尝试对某个类进行反序列化,将会引发异常。
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]——序列化可以允许其他代码查看或修改用其他方式无法访问的对象实例数据,本属性就是安全访问权限的设置。
SerializationInfo——存储将对象序列化或反序列化所需的全部数据。
StreamingContext——描述给定的序列化流的源和目标,并提供一个由调用方定义的附加上下文。


XML序列化
与以上的差不多,就是需要修改命名空间,并且把".bin"改成".xml"文件
xml的命名空间:
using System.Runtime.Serialization.Formatters.Soap;
然后把".bin"文件改成".xml"就可以了。
例:
序列化
 Person XiaoHong = new Person();
            XiaoHong.age = 18;
            XiaoHong.Sex = false;        
            IFormatter formatter = new SoapFormatter();
Stream stream = new FileStream("F:/MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None);
            formatter.Serialize(stream, XiaoHong);
            stream.Close();

反序列化
IFormatter formatter = new SoapFormatter();
            Stream stream = new FileStream("F:/MyFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
            Person XiaoHong = (Person)formatter.Deserialize(stream);
            stream.Close();
            MessageBox.Show(string .Format ("年龄:{0} 性别:{1}",XiaoHong .age ,XiaoHong .Sex ));