zoukankan      html  css  js  c++  java
  • Android序列化+Parcelable和Serializable

    序列化介绍:

    一、序列化、反序列化是什么?

    (1) 名词解释

    对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。
    对象的反序列化:把字节序列恢复为Java对象的过程。

    (2) 序列化详细解释

    对象的序列化涉及三个点关键点:Java对象、字节序列、存储。

    1. Java对象的组成?
    Java对象包含变量与方法。但是序列与反序列化仅处理Java变量而不处理方法,序列与反序列化仅对数据进行处理。

    2. 什么是字符序列?
    字符序列是两个词,字符是在计算机和电信领域中,字符(Character)是一个信息单位。数学上,序列是被排成一列的对象(或事件)。
    《字符-维基百科》 , 《序列-维基百科》 说白了就是连续排列的多个字符的集合。类似于1A165613246546

    3. 存储
    字符序列需要保存到一个地方,可以是硬盘也可以是内存。
    简单说法是:序列化把当前对象信息保存下来。反序列化刚好相反的操作。

    二、Java对象与Java对象序列化的区别?

    Java对象存在的前提必须在JVM运行期间存在,如果想在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象,在现有Java对象的机制下都不可能完成。
    与Java对象不同的是,如果对Java对象执行序列化操作,因为原理是把Java对象信息保存到存储媒介,所以可以在以上Java对象不可能存在的两种情况下依然可以使用Java对象。

    三、为什么要使用序列化、反序列化?

    根据以上对序列化、反序列化的理解,这个疑问可以翻译成,为什么需要把对象信息保存到存储媒介中并之后读取出来?
    因为二中的解释,开发中有在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象的需求。

    Android序列化-- Parcelable和Serializable

    序列化用处:

    1.永久性保存对象,保存对象的字节序列到本地文件中;
    2.通过序列化对象在网络中传递对象;
    3.通过序列化在进程或activity间传递对象。

    android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。

    介绍:

    Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。

    而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

    效率:

    1.Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,
    2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
    3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用     Serializable 

    4.Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化

     

    1、实现Serializable接口

        Serializable的作用是将数据对象存入字节流当中,在需要时重新生成对象,主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。

        implements Serializable接口的的作用就是给对象打了一个标记,系统会自动将其序列化。

        

        案例1:

     1)User.java  (implements Serializable )

     2)MainActivity.java  

         User user = new User();

         Intent intent = new Intent(this,Second.class);  

         intent.putExtra("user",user);

     3)Second.java

         Intent intent = getIntent();

         User user = intent.getSerializableExtra("user");

    2、实现Parcelable接口

     

    实现Parcelable接口的方法

    通过实现Parcelable接口序列化对象的步骤:

    1、实现Parcelable接口。

    2、并且实现Parcelable接口的public void writeToParcel(Parcel dest, int flags)方法 。

    3、自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法。

    简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致

    代码示例:

     1 package parcelable_test.com;
     2 import android.os.Parcel;  
     3 import android.os.Parcelable; 
     4 import android.util.Log;
     5 public class Person implements Parcelable{
     6 private String name;
     7 private int age;
     8 private static final String TAG = ParcelableTest.TAG; 
     9 public String getName() {
    10 return name;
    11 }
    12 public void setName(String name) {
    13 this.name = name;
    14 }
    15 public int getAge() {
    16 return age;
    17 }
    18 public void setAge(int age) {
    19 this.age = age;
    20 }
    21 public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {
    22 @Override
    23 public Person createFromParcel(Parcel source) {
    24 Log.d(TAG,"createFromParcel");
    25 Person mPerson = new Person();
    26 mPerson.name = source.readString();
    27 mPerson.age = source.readInt();
    28 return mPerson;
    29 }
    30 @Override
    31 public Person[] newArray(int size) {
    32 // TODO Auto-generated method stub
    33 return new Person[size];
    34 }
    35 };
    36 @Override
    37 public int describeContents() {
    38 // TODO Auto-generated method stub
    39 Log.d(TAG,"describeContents");
    40 return 0;
    41 }
    42 @Override
    43 public void writeToParcel(Parcel dest, int flags) {
    44 // TODO Auto-generated method stub
    45 Log.d(TAG,"writeToParcel");
    46 dest.writeString(name);
    47 dest.writeInt(age);
    48 }
    49 }

    通过Parcelable接口传递一些数据:

     1 //仅贴出代表性代码
     2 private void fun(){  
     3 Log.d(TAG, "fun");  
     4 Person mPerson = new Person();  
     5 mPerson.setName("tom");  
     6 mPerson.setAge(25);  
     7 //activity跳转
     8 Intent mIntent = new Intent(this,parcelable_test.com.ParcelableTest2.class);  
     9 Bundle mBundle = new Bundle();  
    10 mBundle.putParcelable(KEY, mPerson);  
    11 mIntent.putExtras(mBundle);  
    12 startActivity(mIntent);  
    13 }  

     ParcelableTest2.java,这个类用于获取ParcelableTest传出的数据,并显示在UI上:

     1 package parcelable_test.com;
     2  
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.util.Log;
     6 import android.widget.TextView;
     7  
     8 public class ParcelableTest2 extends Activity{
     9 private static final String TAG = ParcelableTest.TAG;
    10 @Override
    11 public void onCreate(Bundle savedInstanceState) {  
    12         super.onCreate(savedInstanceState);  
    13         setContentView(R.layout.main);     
    14         Log.d(TAG, "ParcelableTest2");
    15         TextView textView = new TextView(this);
    16         Person mPerson = (Person)getIntent().getParcelableExtra(ParcelableTest.KEY);
    17         textView.setText("name = " + mPerson.getName() + "  age = " + mPerson.getAge());
    18         setContentView(textView);
    19     } 
    20 }

    部分来自:http://www.2cto.com/kf/201403/288476.html,http://blog.csdn.net/zyc13701469860/article/details/6429934,谢谢作者

  • 相关阅读:
    JavaScript入门篇 编程练习
    JavaScript入门篇 第三天(认识DOM)
    JavaScript入门篇 第二天(消息对话框+网页弹出)
    JavaScript入门篇 第一天
    网页布局基础 第四次
    本内容中发现无效字符。处理资源 'file:///C:/Users/XDJ/Desktop/1111/press.xml' 时出错。第 5 行,位置: 11 <author>ƽ
    jquery中的each用法以及js中的each方法实现实例
    jQuery获取页面及个元素高度、宽度
    js正则函数match、exec、test、search、replace、split使用介绍集合
    javascript中window.open()与window.location.href的区别
  • 原文地址:https://www.cnblogs.com/ning1121/p/3965923.html
Copyright © 2011-2022 走看看