Android之序列化淺析

来源:http://www.cnblogs.com/JarvisHuang/archive/2016/06/01/5550109.html
-Advertisement-
Play Games

序列化是什麼 序列化是指 把Java對象轉換為位元組序列並存儲到一個存儲媒介的過程 。反之, 把位元組序列恢復為Java對象的過程 則稱之為反序列化。<! more 為什麼要序列化 Java對象存在的一個前提是JVM有在運行,因此,如果JVM沒有運行或者在其他機器的JVM上是不可能獲取到指定的Java對 ...


序列化是什麼

序列化是指把Java對象轉換為位元組序列並存儲到一個存儲媒介的過程。反之,把位元組序列恢復為Java對象的過程則稱之為反序列化。

為什麼要序列化

Java對象存在的一個前提是JVM有在運行,因此,如果JVM沒有運行或者在其他機器的JVM上是不可能獲取到指定的Java對象的。而序列化操作則是把Java對象信息保存到存儲媒介,可以在以上不可能的情況下仍然可以使用Java對象。
所以,序列化的主要作用是:

  • 永久性保存對象,保存對象的位元組序列到本地文件中;
  • 通過序列化對象在網路中傳遞對象;
  • 通過序列化在進程間傳遞對象。

Android中序列化

在Android開發中,經常需要在多個部件(Activity、Fragment或Service)之間通過Intent傳遞一些數據,如果是一些普通類型的數據可以通過PutExtra()進行傳遞,如果是對象的話就得先進行序列化才能傳遞了。在Android中有兩種序列化的介面,Serializable和Parcelable。

  • Serializable:(JavaSE本身就支持的)保存對象的屬性到本地文件、資料庫、網路流、rmi以方便數據傳輸。
  • Parcelable:(Android特有功能)因為Serializable效率過慢,為了在程式內不同組件間以及不同Android程式間(AIDL)高效
    的傳輸數據而設計,這些數據僅在記憶體中存在。

何時使用它們

Parcelable的效率會比Serializable高,數據僅存在於記憶體中。;而Serializable因為使用到了反射,會相對慢一些,因此,只在記憶體間傳遞數據的話推薦用Parcelable,而如果是要進行保存或者網路傳輸則選擇Serializable。

Serializable介面的實現

只需要實現Serializable介面,並提供一個序列化版本id(serialVersionUID)即可。

public class DataBean implements Serializable{
    ...
}

Parcelable介面的使用

Parcelable實現方式略複雜一些,需重寫describeContents和writeToParcel這兩個方法提供一個名為CREATOR常量。實際上就是將如何打包和解包的工作自己來定義,
而序列化的這些操作完全由底層實現。

public class DataBean implements Parcelable{
    private int id;
    private String name;
    private String Account;
    private int kind;
    private String password;
    private String desc;

    public DataBean(){}
    // 用來創建自定義的Parcelable的對象
    public static final Creator<DataBean> CREATOR = new Creator<DataBean>() {
        @Override
        public DataBean createFromParcel(Parcel in) {
            return new DataBean(in);
        }

        @Override
        public DataBean[] newArray(int size) {
            return new DataBean[size];
        }
    };

   //GET SET方法
   ...

    @Override
    public String toString() {
        return "DataBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", Account='" + Account + '\'' +
                ", kind=" + kind +
                ", password='" + password + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }

    @Override
    public int describeContents() {
        return 0;
    }
    // 寫數據進行保存
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.id);
        dest.writeString(this.Account);
        dest.writeString(this.name);
        dest.writeString(this.password);
        dest.writeInt(this.kind);
        dest.writeString(this.desc);
    }
    // 讀數據進行恢復
    protected DataBean(Parcel in) {
        this.id = in.readInt();
        this.kind = in.readInt();
        this.password = in.readString();
        this.name = in.readString();
        this.Account = in.readString();
        this.desc = in.readString();
    }
}

這樣就完成了對DataBean的序列化,使用的時候就可以通過Intent進行傳遞了。

//Activity傳遞對象,不管是實現哪個介面都是用如下方式傳遞
intent.putExtra("data",data);

//在另一個Activity中接收對象的方式分別是:
DataBean data = getIntent().getSerializableExtra("data");
DataBean data = getIntent().getParcelableExtra("data");

Android中序列化的使用大致就是這樣了。

更多文章也可關註我的靜態博客,更新相對會優先些傳送門


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文主要介紹android中如何在外部存儲讀寫數據 sd卡的路徑 sdcard:2.3之前的sd卡路徑 mnt/sdcard:4.3之前的sd卡路徑 storage/sdcard:4.3之後的sd卡路徑 打開file explorer 可以看到sdcard是個空的文件夾,因為這個文件夾是個快捷方式, ...
  • 摘自知乎http://www.zhihu.com/question/20326729 來源:知乎著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。 首先如果你小團隊或者個人開發,當然可以用Xcode,如果大公司跨部門審核調整各種,還是有個快速的原型。 如你要求,可交互。包括常用的A ...
  • 效果圖 1. 導入 .aar 2. fragment_line_chart.xml ...
  • 最近看視頻瞭解了一下應用程式的啟動原理,這裡就做一個博客和大家分享一下,相互討論,如果有什麼補充或不同的意見可以提出來! 1、程式入口 眾所周知,一個應用程式的入口一般是一個 main 函數,iOS也不例外,在工程的 Supporting Files 文件夾中你可以找到main.m,他就是程式的入口 ...
  • cordova plugin add org.apache.cordova.vibration cordova plugin add https://github.com/katzer/cordova-plugin-local-notifications cordova plugin add cor ...
  • MVP是從MVC演變過來的。M即Model層負責提供數據,V即View層負責顯示,P指Presenter層負責邏輯處理。在MVP中View不直接使用Model,它們通過Presenter來通信,它們之間的交互都在Presenter內部進行。實現了View和Model的耦合。<! more 在MVP中 ...
  • 當原生控制項不符合需求,並且進行拓展或組合也無濟於事的時候,就需要自己來繪製一個控制項了。<! more 全新的View 通過源碼,我們可以看到所有的控制項都是通過繼承View類來實現的。所以,我們要創建全新的控制項,也是要通過繼承View來實現。 案例 案例同樣來自《Android群英傳》。 繪製圓弧文本 ...
  • 1. 註意 key 一定要在activity 前面 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...