javascript - 經常聽到序列化和還原序列化,請問這個有什麼用?

來源:互聯網
上載者:User
關鍵字 php javascript java
問題可能文的很泛,因為不瞭解,所以就這麼問了,可以從幾個方面解答麼。

一個是序列化和還原序列化一般用於哪裡?
另外一個是如何使用?
使用這個的好處是什嗎?

回複內容:

問題可能文的很泛,因為不瞭解,所以就這麼問了,可以從幾個方面解答麼。

一個是序列化和還原序列化一般用於哪裡?
另外一個是如何使用?
使用這個的好處是什嗎?

你也知道這樣的問題很泛。如果我要回答你,肯定會去百度一資資料來,粘貼在這裡,哪為何,你自己不去百度呢
這樣的問題 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壓力

對象轉字串儲存;字元還原成對象。這裡的對象可以是不同語言裡不同的資料類型,因為在網路傳輸中都是字元,沒有類型,所以要序列化。序列化其它的應用情境還包括要持久Object Storage Service。

用於哪裡:在Android開發時,我一般是序列化對象並傳遞對象,或者是序列化對象儲存本地,等到用的時候再還原序列化,供樓主參考。

如何使用:對象實現Serializable介面,

通常使用Gson包來序列化或者還原序列化,樣本:

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

也可以自己代碼實現,以List為例,代碼如下:

//將list轉為字串類型資料public static String list2String(List list) throws IOException{//執行個體化一個ByteArrayOutputStream對象,用來裝載壓縮後的位元組檔案ByteArrayOutputStream baos = new ByteArrayOutputStream();//然後將得到的字元資料裝載到ObjectOutputStreamObjectOutputStream oos = new ObjectOutputStream(baos);//writeObject 方法負責寫入特定類的對象的狀態,以便相應的readObject可以還原它oos.writeObject(list);//最後,用Base64.encode將位元組檔案轉換成Base64編碼,並以String形式儲存String listString = new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));//關閉oosoos.close();return listString;}
//將字串形式儲存的list還原public static List string2List(String str) throws StreamCorruptedException,IOException{byte[] mByte = Base64.decode(str.getByte(),Base64.DEFAULT);ByteArrayInputStream bais = new ByteArrayInputStream();ObjectInputStream ois = new ObjectInputStream(bais);List stringList =(List) ois.readObject();return stringList;}

好處:不知道。大概識別對象不能,序列化後才可以傳遞資料或儲存。

就好比快遞打包

序列化和還原序列化,你可以就將其理解為資料的的編碼和解碼過程,一種語言系統下的資料結構只有這個系統下才能夠識別運行;當資料需要跨語言跨系統傳輸時,必須將其轉成一種中間結構,這個中間結構能被雙方識別並能夠被還原,這就是序列化和反序列~~~
例如在java中表示的一個資料對象結構和Javascript表示的對象結構是不同的,那麼通過將java中的一個資料對象序列化成一個Javascript能夠識別結構(JSON格式),javascript就能將其還原成語義相同的資料,在Javascript執行環境下運行~~~
還有映像資料的傳輸你也可以認為是一個序列化和還原序列化的過程,在傳輸前映像資訊序列化成一個位元據流帶像格式資訊,接收方在接收到二進位流後識別出映像格式,將其還原為相應的映像對象顯示出來~~~

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.