本人是新人,有很多技术都是第一次接触,通过学习以后才有所了解,写这篇文章只是为了记录一下我学这些东西所领悟到的内容,如果有什么不对或者不完善的地方,还希望各位前辈们多多指点。
这几天学习了一个序列化与反序列化的东西,说实话以前在学校的时候压根就没注意到这方面的内容,今天接触到了以后才明白这方面的实用性,我首先先讲一下我自己对这个的理解。一般来讲序列化与反序列化应用于跨域操作,比如多个服务器或者客户端与服务器之间的数据传输,将一些比较大的对象通过转换成XML,soap,Json或者Binary的格式,我形象的理解为假如我们要把一团很大的毛线要穿过一个很细的管道,硬塞的话肯定会造成堵塞,那把毛线拆开成一根线,那传过去就相对容易了很多,等全部传过去以后再把那根毛线卷成一团,拆开毛线就是序列化,把毛线卷成一团就是反序列化,数据应用也是如此。
下面我再讲讲序列化与反序列化的实现过程,我自己写了三个很简单的例子,只是为了说明一下这个是通过什么方法实现而已,对技术上的要求不是很高,是个程序员都能看懂哈,顺便说一下,本人用的是C#语言,其他语言的实现过程就不都写出来了,一是自己还没那技术什么语言都会,二是我想会了其中一门语言理解其他语言相对来说也容易很多。
首先就是XML的正反序列化,XML我想应该用的人很多,XML在我的印象就是如果我需要插入几个其他都一样但是有一个属性不一样的数据的时候,我就必须得重新把所有的属性再写一遍,也就是说XML里面的重复的数据会很多,所以这样就比较麻烦,同时也造成XML会比较大,(传说soap会更大...),但是XML比较符合人的阅读,好读就好写,所以对与人来说就比较轻松,在Json没出来之前,我想应该都是用XML比较多的吧,毕竟以前我第一个学的就是XML。在C#中XML的序列化需要引用System.Xml.Serialization中的XmlSerializer类,创建该类的新的对象需要传入目标对象类的类型,就是typeof(目标对象类的类名),对了 忘记说了目标对象类一定要有[Serializable]这个特性,不然是无法进行序列化的。如果对对象类中的某一个属性不需要进行序列化的话,只要给这个属性加上[NonSerialized]这个特性就可以了。在我们创建好对象以后,我们可以通过Serialize(Stream,object)方法来实现对象的序列化,我的写法是将序列化的内容写入到一个文本文件里面,下面就是实例代码:
objectInfo info = new objectInfo();
XmlSerializer xs = new XmlSerializer(typeof(objectInfo));
string path = Server.MapPath("webinfoxml.txt");
try
{
Stream file = new FileStream(path, FileMode.Create, FileAccess.Write);
xs.Serialize(file, info);
file.Close();
file.Dispose();
Response.Write("序列化xml格式成功");
}
然后就是反序列化的实现,有了先前的文本,我们就可以根据这个来做反序列化的工作,首先将文本内容存入一个流中,然后同样是对XmlSerializer这个类创建新的对象,再通过Deserialize(Stream)这个方法来实现反序列化的操作,下面是实例代码:
objectInfo info = new objectInfo();
XmlSerializer xs = new XmlSerializer(typeof(objectInfo));
string path = Server.MapPath("webinfoxml.txt");
Stream file = new FileStream(path, FileMode.Open, FileAccess.Read);
info = (objectInfo)xs.Deserialize(file);
通过这样的方法将流中的数据反序列化成对象objectInfo,然后接下来就是对对象的操作,跨域传对象的操作完成。
至于Binary和Json的用法大同小异,Binary的好处在于序列化以后他的大小是这几种方法里面最小的,而且传输速度也是最快的,在C#中要实现Binary的序列化需要引System.Runtime.Serialization.Formatters.Binary中的BinaryFormatter这个类,同样是创建新的对象,在这个类中同样有Serialize(Stream,object)这个方法,下面是实例代码:
objectInfo info = new objectInfo();
BinaryFormatter bf = new BinaryFormatter();
string path = Server.MapPath("webinfoBinary.txt");
FileStream fs = new FileStream(path, FileMode.Create);
bf.Serialize(fs, info);
fs.Close();
Response.Write("序列化Binary格式成功");
然后是反序列化的实例代码:
objectInfo info = new objectInfo();
BinaryFormatter bf = new BinaryFormatter();
string path = Server.MapPath("webinfoBinary.txt");
Stream file = new FileStream(path, FileMode.Open, FileAccess.Read);
info = (objectInfo)bf.Deserialize(file);
最后一个Json,Json与XML有一个很大的区别就是Json能大大减少对于数组表达的复杂性,如果XML的结构比较适合人的阅读的话,那Json的结构更加适合机器阅读,Json就相当于一个结构精密的数据块,这样的结构既能继承XML的优点,又不会像XML那样有庞大的体积,可谓是非常实用的一个结构。Json一开始是用于java上面的,在C#中若要实现Json,需要引用System.Web.Script.Serialization中的JavaScriptSerializer类,同样是创建新的对象,所不同的是JavaScriptSerializer中的Serialize(object)传入的参数没有Stream,而且他返回的是一个string,下面是实例代码:
objectInfo info = new objectInfo();
JavaScriptSerializer jss = new JavaScriptSerializer();
string path = Server.MapPath("webinfoJson.txt");
try
{
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.Write(jss.Serialize(info));
sw.Close();
sw.Dispose();
Response.Write("序列化json格式成功");
Response.Write(jss.Serialize(info));
}
然后是反序列化的实例代码:
objectInfo info = new objectInfo();
JavaScriptSerializer jss = new JavaScriptSerializer();
string path = Server.MapPath("webinfoJson.txt");
StreamReader rd = new StreamReader(path, System.Text.Encoding.UTF8);
string aa = rd.ReadToEnd();
info = (objectInfo)jss.Deserialize(aa,typeof(objectInfo));
以上就是我对序列化与反序列化的一点心得,只是作为自己的一个记录发表出来,肯定会有很多不足和自己没想到的地方,还希望各位大大能及时指教,我今后也会更加努力学习别的新技术新知识,然后再把我的心得都写到博客里面,能多多的跟大家交流。