第五章 以数据为中心—数据存取(3)

5.1.3自由操作随心所欲—序列化和反序列化

在Android开发中,除了经常会操作普通的文本文件和XML文件以外,也会经常使用序列化和反序列化的方式传递或者存取数据。

Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。实现Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可以用在IPC中。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。

下面就介绍一下使用Parcelable接口,实现两个Activity之间对象的传递,这里就要用到bundle.putParcelable实现传递对象。

1)声明实现接口Parcelable。

// import略

public class Person implements Parcelable{ 

 

    protected String name;

    protected String age;

 

    Person(String name,String age) { 

        this.name = name; 

        this.age = age; 

    } 

    Person(Parcel in) { 

        name = in.readString(); 

        age = in.readString();  

    } 

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getAge() {

        return age;

    }

    public void setAge(String age) {

        this.age = age;

    }

    @Override

    public int describeContents() {

        return 0;

    }

    /**

     * 实现Parcelable的方法writeToParcel,将你的对象序列化为一个Parcel对象

     */

    @Override

    public void writeToParcel(Parcel dest, int flags) {

        dest.writeString(name); 

        dest.writeString(age); 

    }

    /**

     * 实例化静态内部对象CREATOR实现接口Parcelable.Creator

     */

    public static final Creator<Person> CREATOR = new Creator<Person>() { 

        public Person createFromParcel(Parcel in) { 

            return new Person(in); 

        } 

        public Person[] newArray(int size) { 

            return new Person[size]; 

        } 

    }; }

 

2)实现Parcel对象序列化为你的对象,并将Parcelable放入Bundle中。

// import略

public class ParcelableActivity1  extends Activity {

 

    private Button myButton; 

 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        myButton = new Button(this); 

        myButton.setOnClickListener(new OnClickListener() { 

            @Override 

            public void onClick(View arg0) { 

            // 创建Person对象

            Person benParcelable = new Person("testname","testage"); 

                Intent intent = new Intent(); 

                intent.setClass(getApplicationContext(),

                                ParcelableActivity2.class); 

                Bundle bundle = new Bundle(); 

                // 将序列化对象放入bundle

                bundle.putParcelable("person", benParcelable); 

                intent.putExtras(bundle); 

                // 启动ParcelableActivity2的Activity

                startActivity(intent); 

            } 

        }); 

        setContentView(myButton); 

    } 

}

 

3)实现方法createFromParcel,将Parcel对象反序列化为你的对象。

// import略

public class ParcelableActivity2 extends Activity {

    @Override 

    protected void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        setContentView(R.layout.main); 

        // 获取反序列化后的Person对象

        Person parcelable = getIntent().getParcelableExtra("person"); 

        // 打印输出

        System.out.println(parcelable.getName()); 

        System.out.println(parcelable.getAge()); 

    } 

}

 

--------------------------------------------
程序员赚钱不易 一定要学会理财
平安陆金所 隶属于平安集团的p2p平台
年投资回报率7%-9% 是替代银行理财的首选
个人经验 推荐投资安鑫或者有担保的彩虹项目
不要投资安e 那个几乎无法转让 想提前提现非常困难
首次投资1000元即可额外赚几百元 不赚白不赚
--------------------------------------------

4)显示结果,如图5-2所示。

图 5-2 序列化反序列化的结果

 

经验分享:

除了可以利用序列化和反序列化在Activity之间传递Object类型的数据以外,我们也可以利用它来保存和读取数据。

和纯文本文件、XML文件相比,序列化文件可以是二进制的文件,而不是纯文本的,不能直接阅读。所以,如果保存的数据有一定的安全性要求,而安全性的级别又不是非常高,就可以考虑使用序列化的方式进行保存,然后使用反序列化的方式读取。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值