爲什麼要序列化數據

  • 大家都知道進行Android開發的時候,無法將對象的引用傳給Activities或者Fragments,我們需要將這些對象放到一個Intent或者Bundle裏面,然後再傳遞。至於怎麼實現序列化,反序列化相信網上的帖子一大堆了就不一一闡述了

    一. 先說說什麼是序列化—— 序列化,表示將一個對象轉換成可存儲或可傳輸的狀態。序列化後的對象可以在網絡上進行傳輸,也可以存儲到本地。

    二. 那麼爲什麼要序列化?


    序列化的原因基本三種情況: 

    1.永久性保存對象,保存對象的字節序列到本地文件中;

    2.對象在網絡中傳遞; 

    3.對象在IPC間傳遞。

     三.  Android中的兩種序列化機制
    第一種: JAVA中的Serialize機制,譯成串行化、序列化……,其作用是能將數據對象存入字節流當中,在需要時重新生成對象。主要應用是利用外部存儲設   備保存對象狀 態,以及通過網絡傳輸對象等。
    第二種:在Android系統中,定位爲針對內存受限的設備,因此對性能要求更高,另外系統中採用了新的IPC(進程間通信)機制,必然要求使用性能更出色的對象傳輸方式。在這樣的環境下, Parcel被設計出來,其定位就是輕量級的高效的對象序列化和反序列化機制。
    Android中序列化有以下幾個特徵:
    1.整個讀寫全是在內存中進行,所以效率比JAVA序列化中使用外部存儲器會高很多;
    2.讀寫時是4字節對齊的
    3.如果預分配的空間不夠時,會一次多分配50%;
    4.對於普通數據,使用的是mData內存地址,對於IBinder類型的數據以及FileDescriptor使用的是mObjects內存地址。 後者是通過flatten_binder()和 unflatten_binder()實現的,目的是反序列化時讀出的對象就是原對象而不用重新new一個新對象。

    我寫了兩個Activity,一個是MainActivity,裏面通過intent把一個實現序列化接口的實體類User對象傳遞過去,

        User user = new User();
        user.setId(1);
        user.setName("zhangsan");
     
        Intent intent = new Intent();
        intent.setClass(this, TwoActivity.class);
        intent.putExtra("user", user);
     
        startActivity(intent);
                Log.d("main", user+"");
    另一個TwoActivity裏面,接收這個User對象:
    Intent intent = this.getIntent();
    User user = (User) intent.getSerializableExtra("user");

        Log.d("two", user+"");
    結果:打印出來的兩個user指向的不是同一地址 這是爲什麼呢?

    那麼好:可以這樣理解,當把一個對象從一個地方傳到另一個地方,傳遞的不是引用,它的地址肯定會改變,世界上沒有兩個相同的地址。更深層次理解應該是傳遞前的處理:傳遞前根據該對象序列化,接收後反序列化再重新生成該對象,根據序列化和反序列化的規則,某些特徵應該是一樣的,包括值。

                   putSerializable,是通過對象的序列化和反序列化來實現Activity之間對象的傳遞的,所以這種方法得到的就是兩個完全不一樣的對象(Activity2中的對象obj就相當於new了一個新對象,然後將Activity1中的對象obj的值都賦給了它,所以可以說它們的內容是一樣的,但是對象不一樣。
    再說說JAVA中的Serialize機制,譯成串行化、序列化……,其作用是能將數據對象存入字節流當中,在需要時重新生成對象。主要應用是利用外部存儲設備保存對象狀態,以及通過網絡傳輸對象等。   
                假如兩個avtivity傳遞的是一個對象,那麼當在TwoActivity裏繼續操作MainActivity的對象那麼必將造成內存泄漏。
    --------------------- 
    作者:野野比的職業生涯 
    來源:CSDN 
    原文:https://blog.csdn.net/jiuchen4107/article/details/52381744 
    版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章