• android precelable和Serialization序列化数据传输


    一 序列化原因:

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

    二 至于选取哪种可参考下面的原则:

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

    实现:
    1 Serializable 的实现,只需要继承  implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。

    2 Parcelable:

    Android 中Parcelable的作用

    android提供了一种新的类型:Parcel。本类被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以

    外,只有实现了Parcelable接口的类才能被放入Parcel中。

    Parcelable实现要点:需要实现三个东西

    1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.声明如下:

    writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

    2)describeContents方法。没搞懂有什么用,反正直接返回0也可以

    3)静态的Parcelable.Creator接口,本接口有两个方法:

    createFromParcel(Parcel in) 实现从in中创建出类的实例的功能

    newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。估计本方法是供外部类反序列化本类数组使用。

    实例:

    下面是Person类引用了Parcelable接

    定义----

    package parcelable_test.com;

    import android.os.Parcel;

    import android.os.Parcelable;
    import android.util.Log;
    public class Person implements Parcelable{
    private String name;
    private int age;
    private static final String TAG = ParcelableTest.TAG;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {
    @Override
    public Person createFromParcel(Parcel source) {
    Log.d(TAG,"createFromParcel");
    Person mPerson = new Person();
    mPerson.name = source.readString();
    mPerson.age = source.readInt();
    return mPerson;
    }
    @Override
    public Person[] newArray(int size) {
    // TODO Auto-generated method stub
    return new Person[size];
    }
    };
    @Override
    public int describeContents() {
    // TODO Auto-generated method stub
    Log.d(TAG,"describeContents");
    return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    Log.d(TAG,"writeToParcel");
    dest.writeString(name);
    dest.writeInt(age);
    }
    }

     

    传递 -----

    private void fun(){
    Log.d(TAG, "fun");
    Person mPerson = new Person();
    mPerson.setName("tom");
    mPerson.setAge(25);
    Intent mIntent = new Intent(this,parcelable_test.com.ParcelableTest2.class);
    Bundle mBundle = new Bundle();
    mBundle.putParcelable(KEY, mPerson);
    mIntent.putExtras(mBundle);
    startActivity(mIntent);
    }

     

     

    获取-----

    package parcelable_test.com;

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;

    public class ParcelableTest2 extends Activity{
    private static final String TAG = ParcelableTest.TAG;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Log.d(TAG, "ParcelableTest2");
    TextView textView = new TextView(this);
    Person mPerson = (Person)getIntent().getParcelableExtra(ParcelableTest.KEY);
    textView.setText("name = " + mPerson.getName() + " age = " + mPerson.getAge());
    setContentView(textView);
    }
    }

     

  • 相关阅读:
    fetch数据请求
    React exact路由精确匹配
    React Router中的Link和NavLink组件有什么区别?
    new FileReader() 文件上传
    git stash部分文件
    主机屋的免费云虚拟主机
    MySQL数据库默认的存储引擎类型是MyISAM并不支持事务的坑,要把存储类型改为InnoDB
    使用ExcelPackage,OfficeOpenXml做EXCEL导入时一个方法的坑,对应类的字段只能定义为string类型
    mysql两个关联表,同名字段同时返回时,原字段名写靠前的表的字段名会可以保留原字段名,靠后的会被自动as为(1)这样的,
    MySql 里的IFNULL、NULLIF和ISNULL用法-区别于MSSQL
  • 原文地址:https://www.cnblogs.com/softwarelanguagebs/p/4716972.html
Copyright © 2020-2023  润新知