一提到序列化,也许你会开始迷惑了,它是什么意思呢?如果从这三个
字本身,我们也许就要理解错了,序列化并不是排成序列的意思,它呢,
类似于我们平时用的照相机,会将某个状态给记录下来,当我们想用的时
候,就像照片一样,拿出来就行了。
 具体的定义这样的,序列化是将对象状态转换为可保持(保存
)或传输的形式的过程。序列化的补集是反序列化,后者将六转换为对象
。这两个过程一起保证数据易于存储和传输。
 .NET Framework提供了两个序列化技术:
1、二进制序列化保持类型保真,这对于多次调用应用程序时保持对象状态
非常有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间
共享对象。您可以将对象序列化到流、磁盘、内存和网络等。远程处理使
用序列化,“按值"在计算机或应用程序域之间传递对象。(游戏中画面的
同步也就用到了序列化)
 二进制序列化是这么一个过程:它是将一个对象状态存储到存
储介质的过程。在这个过程中,对象的公共字段和私有字段以及类(包括
含有该类的程序集)的名称,将转换成字节流,而字节流接着将写入数据
流。这样就完成了序列化了。
 当你需要这张”照片“时,那么,我们就可以通过反序列化来
取。这时,会得到原始对象的准确克隆。
二进制序列化需要的命名空间
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
下面是一个自定义的序列化:
 class Program
    {
        static void Main(string[] args)
        {
            Pigeon pigeon = new Pigeon("可爱的格格", "家鸽");
            //序列化
            IFormatter formatter = new BinaryFormatter();//声明一个二进
制的格式化的对象
            Stream stream = new FileStream(@"F:\MySeri.bin",
FileMode.Create, FileAccess.Write, FileShare.None);//定义了一个文件
流,并设置了相应的权限
            formatter.Serialize(stream, pigeon);//序列化
            stream.Close();
            //反序列化
            Stream Dstream = new FileStream(@"F:\MySeri.bin",
FileMode.Open, FileAccess.Read, FileShare.Read);
            Pigeon newpigeon = (Pigeon)formatter.Deserialize
(Dstream);//反序列化
            Console.WriteLine("名字:{0} \n 类型:{1}
",newpigeon.name,newpigeon.type);
        }
    }
    class Birds
    {
        public  string name;
        public  int age;
       
    }
    //实现自定义的序列化
    [Serializable]
    class Pigeon:Birds,ISerializable
    {
        public string type;
        public Pigeon(string name,string type)
        {
            this.type = type;
            this.name = name;
        }
        //
        public Pigeon(SerializationInfo info,StreamingContext context )
        {
            name = info.GetString("name");
            type = info.GetString("type");
       
        }
        #region ISerializable 成员
        //实现了接口ISerializable中的方法
        [SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
        public virtual void GetObjectData(SerializationInfo info,
StreamingContext context)
        {
            info.AddValue("name", name);
            info.AddValue("type", type);
        }
        #endregion
    }
另一种就是xml的序列化,xml序列化只序列化公共属性和字段,并且,不
包吃类型保真。当你希望提供或使用数据而不限制使用该数据的应用程序
时,这一点非常有用。由于xml是开放式的标准,因此他对于通过Web共享
数据来说是一个理想选择。
另外,xml的序列化也用到了Soap,由于Soap同样是开放式的标准,这使
它也成为一个理想选择。
要想使用xml的序列化,需要引入
using System.Runtime.Serialization.Formatters.Soap;这样的一个命名空
间,注意:这个需要在解决方案资源管理器中的引用中加入的。
然后,在使用时,和二进制的差不多,只不过,要将
IFormatter formatter = new BinaryFormatter();换成
IFormatter soapformatter = new SoapFormatter();
然后,就是在流中写入的文件时,要加原来的.bin的扩展名换成.xml;
总体来说,二进制的序列化的数据少,而xml的序列化比较多。用时,就要
根据具体情况了。。。