Serialize序列化和Unserialize反序列化
原创
©著作权归作者所有:来自51CTO博客作者CupidoZ的原创作品,请联系作者获取转载授权,否则将追究法律责任
序列化的理解:
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Internet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。
通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。
对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。
以上解释为百度百科上的标准解释,但是我们在使用和熟悉序列化的过程当中,总是会觉得序列化的概念难以真正理解,那么怎么直白的弄清除什么是序列化,什么又是反序列化呢?
记得N多年以前,有些IT从业的前辈用另外一种方式的说明方式解释过序列化和反序列化。
序列化:当数据有了清晰且不变的结构时,它就可以按照统一的格式被编辑成队列,逐个被持久化或版持久化到任意介质之中,这就叫做序列化。
反序列化:按照统一的格式把经过序列化处理过的数据结构还原回对象的原貌,这就是反序列化。
序列化的作用
序列化和反序列化为我们传输数据结构的过程提供了良好的标准化支撑,序列化和反序列化的过程中所使用的统一数据处理方式又可以从某种意义上解决某些数据的保密性问题,为数据提供了一定程度上的算法权限加密,序列化还可以为我们的非协议标准层面上的传输提供解决方案
下面是百度上一段C#的序列化过程示例,最然未介绍如何构造出序列化方式,但是可以清晰的看出序列化和反序列化的正反过程,日常编程工作中掌握这些即可
using System;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;//二进制序列化
using System.Runtime.Serialization.Formatters.Soap;//SOAP序列化
using System.Xml.Serialization;//XML序列化
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//如果要想保存某个class中的字段,必须在class前面加个这样[Serializable]
[Serializable]
public class Person
{
public int age;
public string name;
[NonSerialized] //如果某个字段不想被保存,则加个这样的标志
public string secret;
}
//序列化
private void btnXlh_Click(object sender, EventArgs e)
{
Person person = new Person();
person.age = 28;
person.name = "Hoam\r\n";
person.secret = "no look";
string str = System.AppDomain.CurrentDomain.BaseDirectory;
//二进制序列化
FileStream streamHx = new FileStream(str+"personHx.txt", FileMode.Create);
BinaryFormatter bFormatHx = new BinaryFormatter();
bFormatHx.Serialize(streamHx, person);
streamHx.Close();
//SOAP序列化
FileStream streamSoap = new FileStream(str + "personSoap.xml", FileMode.Create);
SoapFormatter bFormatSoap = new SoapFormatter();
bFormatSoap.Serialize(streamSoap, person);
streamSoap.Close();
//XML序列化 //某个字段加[NonSerialized]标志不起作用,仍被保存
FileStream streamXml = new FileStream(str+ "personXml.xml", FileMode.Create);
XmlSerializer xmlserilize = new XmlSerializer(typeof(Person));
xmlserilize.Serialize(streamXml, person);
streamXml.Close();
}
//反序列化
private void btnFxlh_Click(object sender, EventArgs e)
{
Person person = new Person();
string str = System.AppDomain.CurrentDomain.BaseDirectory;
object data;
//二进制反序列化
FileStream streamHx = new FileStream(str + "personHx.txt", FileMode.OpenOrCreate);
BinaryFormatter bFormatHx = new BinaryFormatter();
data = bFormatHx.Deserialize(streamHx); //反序列化得到的是一个object对象.须做下类型转换
streamHx.Close();
//SOAP反序列化
FileStream streamSoap = new FileStream(str + "personSoap.xml", FileMode.OpenOrCreate);
SoapFormatter bFormatSoap = new SoapFormatter();
data = bFormatSoap.Deserialize(streamSoap); //反序列化得到的是一个object对象.须做下类型转换
streamSoap.Close();
//XML反序列化
FileStream streamXml = new FileStream(str + "personXml.xml", FileMode.OpenOrCreate);
XmlSerializer xmlserilize = new XmlSerializer(typeof(Person));
data = xmlserilize.Deserialize(streamXml); //反序列化得到的是一个object对象.须做下类型转换
streamXml.Close();
}
}
}
个人学习用途博客 部分内容摘抄自网络