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 ""; |
} |
} |
} |