序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
序列化的目的:
  1、以某种存储形式使自定义对象持久化;2、将对象从一个地方传递到另一个地方。
.NET Framework 提供两种序列化技术:
  * 二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。
  * XML 序列化仅序列化公共属性和字段,且不保持类型保真度。当您要提供或使用数据而不限制使用该数据的应用程序时,这一点是很有用的。由于 XML 是一个开放式标准,因此,对于通过 Web 共享数据而言,这是一个很好的选择。SOAP 同样是一个开放式标准,这使它也成为一个颇具吸引力的选择。

以上摘自百度百科,以前常听说,一直没时间去试,今天偶然看到,才发现其实如此简实用。以下是MVC三层中的Model层中用户Model的代码,简单地演示如何实现序列化与序列化。

通过序列化存到数据库中的形式是这样的 <?xml version="1.0"?>看不到任何数据,数据真的存进去了吗?
为了能确认这一点,又在代码里调试了一次,果然结果还是取到了!查看如下:
<?xml version="1.0"?>
<UserCK xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Email />
<EnableConfig>false</EnableConfig>
<RouteTableID>1</RouteTableID>
</UserCK>
如此以来还真有被加密的感觉。想起以前将文件以二进制流存入数据库存时,数据库视图显示的也是“二进制数据”这几个字,
这里看不到序列化结果也就见怪不怪了。

//用户类

public class v_User

{

    // 字段

    private UserCK _UserCkObj;

 

    // 属性

    public UserCK UserCkObj

    {

        get

        {

            if (this._UserCkObj == null)

            {

                this._UserCkObj = UserCK.Deserialize(this._User_CK);

            }

            return this._UserCkObj;

        }

        set

        {

            if (this._UserCkObj == null)

            {

                this._UserCkObj = UserCK.Deserialize(this._User_CK);

            }

            this._UserCkObj = value;

        }

    }

 

    // 嵌套类型

    public class UserCK

    {

        // 字段

        public string Email = "";

        public bool EnableConfig = true;

        public int RouteTableID;

 

       // 反序列化

        public static v_User.UserCK Deserialize(string xmlSource)

        {

            v_User.UserCK obj = new v_User.UserCK();

            if (xmlSource.Trim() != "")

            {

                try

                {

                    XmlSerializer x = new XmlSerializer(typeof(v_User.UserCK));

                    Stream stream = GetStream(xmlSource);

                    stream.Seek(0L, SeekOrigin.Begin);

                    obj = (v_User.UserCK) x.Deserialize(stream);

                    stream.Close();

                }

                catch

                {

                }

            }

            return obj;

        }

        //string转换为数据流流

        public static Stream GetStream(string strSource)

        {

              Stream stream = new MemoryStream();

              StreamWriter outerstr = new StreamWriter(stream);

              outerstr.Write(strSource);

              outerstr.Flush();

              return stream;

              

        }

        //序列化

        public string Serialize()

        {

            try

            {

                XmlSerializer s = new XmlSerializer(typeof(v_User.UserCK));

                Stream stream = new MemoryStream();

                s.Serialize(stream, this);

                stream.Seek(0L, SeekOrigin.Begin);

                using (StreamReader reader = new StreamReader(stream))

                {

                    return reader.ReadToEnd();

                }

            }

            catch

            {

            }

            return "";

        }

    }

}