javascript - 经常听到序列化和反序列化,请问这个有什么用?
问题可能文的很泛,因为不了解,所以就这么问了,可以从几个方面解答么。
一个是序列化和反序列化一般用于哪里?
另外一个是如何使用?
使用这个的好处是什么?
回复内容:
问题可能文的很泛,因为不了解,所以就这么问了,可以从几个方面解答么。
一个是序列化和反序列化一般用于哪里?
另外一个是如何使用?
使用这个的好处是什么?
你也知道这样的问题很泛。如果我要回答你,肯定会去百度一资资料来,粘贴在这里,哪为何,你自己不去百度呢
这样的问题 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”这种说法是省略语言的说法
存储数据
传输数据
序列化,就是把要用的东西用某种方式存起来,方便日后调用。
反序列化,就是调用先前序列化存起来的数据
个人理解(关于序列化与反序列化我只在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执行环境下运行~~~
还有图像数据的传输你也可以认为是一个序列化和反序列化的过程,在传输前图像信息序列化成一个二进制数据流带上图像格式信息,接收方在接收到二进制流后识别出图像格式,将其还原为相应的图像对象显示出来~~~

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

在PHP中可以通過使用不可預測的令牌來有效防範CSRF攻擊。具體方法包括:1.生成並在表單中嵌入CSRF令牌;2.在處理請求時驗證令牌的有效性。
