using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.IO;
 using System.Runtime.Serialization.Formatters.Binary;namespace SerializeBin
 {
      //(1)二进制序列化与反序列化的程序示例    [Serializable]  //必须添加序列化特性
    public class Person
    {
        private string Name;//姓名
        private bool Sex;//性别,是否是男
        public Person(string name, bool sex)
        {
            this.Name = name;
            this.Sex = sex;
        }
        public override string ToString()
        {
            return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");
        }
    }
    [Serializable]  //必须添加序列化特性
    public class Programmer : Person
    {
        private string Language;//编程语言
        public Programmer(string name, bool sex, string language) : base(name, sex)
        {
            this.Language = language;
        }
        public override string ToString()
        {
            return base.ToString() + "\t编程语言:" + this.Language;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //创建Programmer列表,并添加对象
            List<Programmer> list = new List<Programmer>();
            list.Add(new Programmer("李志伟", true, "C#"));
            list.Add(new Programmer("Coder2", false, "C++"));
            list.Add(new Programmer("Coder3", true, "Java"));
            //使用二进制序列化对象
            string fileName = @"Programmers.dat";//文件名称与路径
            Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
            BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
            binFormat.Serialize(fStream, list);
             fStream.Close();
             //使用二进制反序列化对象    
             Console.WriteLine("使用二进制反序列化对象   ");
             fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);            list.Clear();//清空列表
            fStream.Position = 0;//重置流位置
            list = (List<Programmer>)binFormat.Deserialize(fStream);//反序列化对象
            foreach (Programmer p in list)
            {
                Console.WriteLine(p);
            }
            Console.Read();
        }
    }
}

使用二进制序列化,必须为每一个要序列化的的类和其关联的类加上[Serializable]特性,对类中不需要序列化的成员可以使用[NonSerialized]特性。

二进制序列化对象时,能序列化类的所有成员(包括私有的),且不需要类有无参数的构造方法。

使用二进制格式序列化时,它不仅是将对象的字段数据进行持久化,也持久化每个类型的完全限定名称和定义程序集的完整名称(包括包称、版本、公钥标记、区域性),这些数据使得在进行二进制格式反序列化时亦会进行类型检查。所以反序列化时的运行环境要与序列化时的运行环境要相同,否者可能会无法反序列化成功。