xml序列化与反序列化

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
序列化的目的:
  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 "";
        }
    }
}
 
posted @ 2009-07-30 07:51  -飛天蟲  阅读(231)  评论(0编辑  收藏  举报