技术点滴

-----------记录每一次的进步

导航

序列化学习小结(一)

Posted on 2009-05-04 13:44  追逐技术  阅读(335)  评论(0)    收藏  举报

一,定义

         序列化:把对象的状态转化为字节流的过程。

         反序列化:把字节流转化为对象的过程。

二,用处:

       1,对象的状态可以永久保存。

         实例1:比如软件使用过程中,可以通过某个对象类来管理当前软件的界面状态,如:皮肤,窗体的背景颜色,字体大小等等。主要是用户在使用软件的过程中可以自己定制界面。为了实现用户下次再启动该软件的时候可以显示上次的定制界面。可以把存储该界面状态的对象序列化永久保存到磁盘,数据库,缓存等等。下次在启用的时候就可以通过反序列化该对象,以实现对象状态的初始化。

        实例2:当我们在开发软件有用到数据库的时候,通常在windows开发过程中,通常把连接数据库的字符串存储在app.config配置文件中。web开发过程中,通常把连接数据库字符串的信息保存在web.config中。当我们的软件要安装到客户机器上的时候,通常要重新配置连接字符串。为了实现0技术安装,我们可以通过在用户第一次使用的时候,让它提供数据库的信息,程序利用序列化把这些信息生成app.config或者web.config文件中。实现配置文件的重新配置。

       2,方便对象状态信息在网络中传输。

          实例1:网络聊天信息的传输。

          实例2:Web Services中信息的传输。

          实例3:2个应用程序间共享状态信息。如:你在某个应用程序中使用某个对象保存用户下订单信息,另外一个应用程序专门来处理订单信息的,该应用程序也使用该对象来读取订单信息。为了实现在2个应用程序间共享该信息就可以使用把对象序列化然后再网络中传输共享。

        序列化用的比较多的一般是在分布式应用程序中。

三,缺点

1,序列化和反序列化的过程要占用一定的CPU和内存资源

2,序列化和反序列化的速度相对比较慢

3,如果序列化的文件以XML文件存储在本地磁盘的话,占用空间较大,且安全性比较低。

 

四,.NET Framework2.0提供的序列化的方法

1,二进制序列化

2,SOAP序列化

3,XML序列化

4,自定义序列化过程

(一),二进制序列化

         BinaryFormatter类,所在命名空间:System.Runtime.Serialization.Formatters.Binary

         注意:被序列化的类必须标记为SerializableAttribute,这样它的所有成员都会被序列化,不管是私有字段还是共有字段,除非有成员有不序列化标记:NonSerializedAttribute

         二进制序列化的优点:

        1,快速   2,生成的文件较小   3,支持复杂对象和只读属性的对象

      方法:

           1,序列化

               BinaryFormatter.Serialize(filestream,Obj)

           2,反序列化

               BinaryFormatter.DeSerialize(filestream,Obj)

实例:

 

public class SerializationHelp
    {
        /// <summary>
        /// 实现序列化
        /// </summary>
        /// <param name="obj">被序列化的对象</param>
        public void BinarySerialize(object obj)
        {
            using (FileStream fs = new FileStream("config.txt", FileMode.OpenOrCreate))
            {
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                    binaryFormatter.Serialize(fs, obj);

            }
        }
        /// <summary>
        /// 实现反序列化
        /// </summary>
        /// <param name="fs">文件流</param>
        /// <returns></returns>
        public jm BinaryDeserialize(string path)
        {
            using (FileStream fs = new FileStream(path, FileMode.Open))
            {
                BinaryFormatter binaryFormatter = new BinaryFormatter();

                    return (jm)binaryFormatter.Deserialize(fs);

            }
        }
    }

被序列化的类。

 [Serializable]
    public class jm
    {
        private string pathFile;
        /// <summary>
        /// 存储界面风格文件信息
        /// </summary>
        public string PathFile
        {
            get
            {
                return this.pathFile;
            }
            set
            {
                this.pathFile = value;
            }
        }
    }