c#中的二进制序列化

c#中的序列化与反序列化

 直接上代码:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace SerilizeLearn002
{
    //二进制序列化
    [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 + "性别:" + (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() + "编程语言:" + this._language;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
          //创建programer 列表;
            List<Programmer> list = new List<Programmer>();
            list.Add(new Programmer("jack",true,"c#"));
            list.Add(new Programmer("tom",true,"c++"));
            list.Add(new Programmer("frank",true,"java"));

            //使用二进制序列化对象;
            string fileName = @"d:\Programmer.dat";
            Stream fsStream = new FileStream(fileName,FileMode.Create,FileAccess.ReadWrite);
            BinaryFormatter binFormat = new BinaryFormatter(); //二进制序列化器;
            binFormat.Serialize(fsStream,list);
            
            //然后我们再把他给反序列化出来滴呀; 
            list.Clear(); //清空列表信息滴呀;
            fsStream.Position = 0; //重置流位置;

            list = (List<Programmer>)binFormat.Deserialize(fsStream);
            foreach (Programmer p in list)
            {
                Console.WriteLine(p);
            }
            fsStream.Close(); //释放非托管资源;
            Console.ReadLine();
        }
    }
}

 

打开文件(记事本)虽然出现了乱码,单我们还是能够看到,序列化之后,它保存了版本等信息。

 

总结:

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

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

使用二进制格式序列化时,它不仅是将对象的字段数据进行持久化,也持久化每个类型的完全限定名称和定义程序集的完整名称(包括包称、版本、公钥标记、区域性),这些数据使得在进行二进制格式反序列化时亦会进行类型检查。

所以反序列化时的运行环境要与序列化时的运行环境要相同,否者可能会无法反序列化成功。(只是可能)

 

posted @ 2015-12-28 17:18  咕-咚  阅读(585)  评论(0)    收藏  举报