ホームページ  >  記事  >  バックエンド開発  >  javascript - 经常听到序列化和反序列化,请问这个有什么用?

javascript - 经常听到序列化和反序列化,请问这个有什么用?

WBOY
WBOYオリジナル
2016-06-06 20:12:371078ブラウズ

问题可能文的很泛,因为不了解,所以就这么问了,可以从几个方面解答么。

一个是序列化和反序列化一般用于哪里?
另外一个是如何使用?
使用这个的好处是什么?

回复内容:

问题可能文的很泛,因为不了解,所以就这么问了,可以从几个方面解答么。

一个是序列化和反序列化一般用于哪里?
另外一个是如何使用?
使用这个的好处是什么?

你也知道这样的问题很泛。如果我要回答你,肯定会去百度一资资料来,粘贴在这里,哪为何,你自己不去百度呢
这样的问题 google 和 百度才是最好的老师

最常用的场景,应该就是持久化对像了吧。比如你要把一个对像存进mysql

就是你这次创建了个对象,或者数组,
执行一定的操作之后,你把他存起来,然后方便下次用,你直接拿出来用就行了,
你像你打游戏,下线了,下次上线接着这次的进度开始玩,不用重新申请帐号,重新升级了;

还有就是多种语言之间互动,比如你 在外国 饭店 要吃鸡,你说中文他听不懂,
他能听懂的你不会说,
你就画了一个鸡,你认识,他也认识,这个画的鸡,就是序列化...

简单理解就是计算机之间是通过二进制通信,所以需要把内存中的对象等序列化为二进制数据,接收方再反序列成对象。

其实应用场景很简单,你在一端将一个内存对象写入到socket中,接收端接受到之后直接使用这个对象。 前面是序列化,后面是反序列化。 完成这个功能的方式有很多,比如最简单的json格式,httpserver会将自己的数据嵌套起来,并且dump成文json字符串发给浏览器,浏览器js代码接受到数据直接将json转换为js数据结构,将接受到的串透明地转换成对象。

比如你要用localStorage,要存储的数据是个对象,但是localStorage只能存字符串,你怎么办?办法之一就是将对象序列化为一个json字符串,等你要用localStorage中的数据时,你就可以把其中的json字符串反序列化为js对象后使用,明白吗?

问题的根源在于你不懂网络编程!
无论是进程间、线程间的通讯,网络之间client和server通过socket通讯,还是把对象写到db(实际上也是socket)。
这些网络交互都是通过收发二进制流的,所以发送时候需要将对象序列化二进制数据发送出去,之后接收端收到二进制数据,再通过反序列化变成对象。
要搞清楚问题前,先搞清楚自己不懂的是什么

约定如下:如果将协议、格式、规范定义为特殊,将运行时对象定义为通用,那么通用的对象基本都是存储在于交互困难的内存中的,而特殊存在于其他交互方便的(例如java对象在Java生态圈是通用的,json格式在Java生态就是特殊的)。

由此序列化即“通用”转为“特色”,反之即反序列化。因为序列化也可从内存到硬盘,所以序列化是包括持久化的。

一般的协议、规范、格式都是对各个生态友好的,普遍用于生态圈之间的数据交互。

具体的用法不尽相同。

通常我们说序列化是基于某个语言生态圈的,比如用Java将Java bean对象序列化为xml。而“浏览器将html反序列化为dom对象” “将数据库数据序列化为json”这种说法是省略语言的说法

  1. 存储数据

  2. 传输数据

序列化,就是把要用的东西用某种方式存起来,方便日后调用。

反序列化,就是调用先前序列化存起来的数据

个人理解(关于序列化与反序列化我只在php类和json数据时用到过…),仅供参考~

基本的两个用途,存储和传输,其实都是转储。转储,由一存储介质转移到另一存储介质,最常用的由内存到硬盘,数据或者对象在俩者之间的表示是有区别的,为了能在两者之间还原对象,需要以特定的方式读取和写入数据或者对象。
序列化和反序列化是相对的,一般是将数据或者对象从内存转储到其他介质是序列化,从其他介质转出到内存是反序列化。

我就问一个问题,两台电脑,A和B,A现在有一个对象的实例,如何发送给B?

场景一,mysql5.7以前不支持json,一个字段存多图就要序列化,就是按着一定规则存到数据库。取出就是反序列化啦。

场景二、载入对象/对象转换 例如查询得到的对象转数组 减少io压力

对象转字符串存储;字符还原成对象。这里的对象可以是不同语言里不同的数据类型,因为在网络传输中都是字符,没有类型,所以要序列化。序列化其它的应用场景还包括要持久对象存储。

用于哪里:在Android开发时,我一般是序列化对象并传递对象,或者是序列化对象保存本地,等到用的时候再反序列化,供楼主参考。


如何使用:对象实现Serializable接口,

通常使用Gson包来序列化或者反序列化,示例:

<code>String str = gson.toJson(yourObj);</code>
<code>if (!TextUtils.isEmpty(str)) {
    Type type = (Type) new TypeToken<list>>() {
    }.getType();
    List<yourobj> list = new Gson().fromJson(str, type);
}</yourobj></list></code>

也可以自己代码实现,以List为例,代码如下:

<code>//将list转为字符串类型数据
public static String list2String(List<e> list) throws IOException{
//实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//然后将得到的字符数据装载到ObjectOutputStream
ObjectOutputStream oos = new ObjectOutputStream(baos);
//writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它
oos.writeObject(list);
//最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存
String listString = new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
//关闭oos
oos.close();
return listString;
}</e></code>
<code>//将字符串形式保存的list还原
public static List<e> string2List(String str) throws StreamCorruptedException,IOException{
byte[] mByte = Base64.decode(str.getByte(),Base64.DEFAULT);
ByteArrayInputStream bais = new ByteArrayInputStream();
ObjectInputStream ois = new ObjectInputStream(bais);
List<e> stringList =(List<e>) ois.readObject();
return stringList;
}</e></e></e></code>

好处:不知道。大概识别对象不能,序列化后才可以传递数据或存储。

就好比快递打包

序列化和反序列化,你可以就将其理解为数据的的编码和解码过程,一种语言系统下的数据结构只有这个系统下才能够识别运行;当数据需要跨语言跨系统传输时,必须将其转成一种中间结构,这个中间结构能被双方识别并能够被还原,这就是序列化和反序列~~~
例如在java中表示的一个数据对象结构和Javascript表示的对象结构是不同的,那么通过将java中的一个数据对象序列化成一个Javascript能够识别结构(JSON格式),javascript就能将其还原成语义相同的数据,在Javascript执行环境下运行~~~
还有图像数据的传输你也可以认为是一个序列化和反序列化的过程,在传输前图像信息序列化成一个二进制数据流带上图像格式信息,接收方在接收到二进制流后识别出图像格式,将其还原为相应的图像对象显示出来~~~

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。