Android Parcelable实现Java对象的序列化

Android开发中,我们需要在不同组件(Activity、Service、BroadcastReceiver等)之间传递数据,有的时候甚至需要把对象直接传递过去。这时候就需要对Java对象进行序列化。Java序列化和反序列化虽然非常方便,但是它的效率很低。而Android提供的Parcelable接口就解决了这个问题,它可以较为高效地序列化和反序列化数据,并且适合在内存之间传递对象。

一、Parcelable接口的介绍

Parcelable是Android特有的轻量级序列化方法。与Java的Serializable相比,Parcelable更快更轻巧,而且是一种显式的序列化方法。它通过将数据一次性写入或读取内存块来完成序列化和反序列化,相对而言效率更高。

Android平台中提供的许多类已经实现了Parcelable接口,例如Intent、Bundle和Cursor等。如果我们需要在自己的类中使用Parcelable,则需要实现Parcelable接口,并实现writeToParcel()和createFromParcel()这两个方法。

二、实现Parcelable接口

实现Parcelable接口需要以下几个步骤:

1、定义一个实现Parcelable接口的类:

public class User implements Parcelable {
    private String userName;
    private int age;

    //构造方法
    public User(String userName, int age) {
        this.userName = userName;
        this.age = age;
    }

    //Getter和Setter方法
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //实现Parcelable接口
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.userName);
        dest.writeInt(this.age);
    }

    protected User(Parcel in) {
        this.userName = in.readString();
        this.age = in.readInt();
    }

    public static final Creator CREATOR = new Creator() {
        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

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

2、实现Parcelable接口中的抽象方法describeContents(),返回0即可。

3、实现Parcelable接口中的抽象方法writeToParcel(Parcel dest, int flags),将需要序列化的数据写入Parcel中。

4、实现Parcelable接口中的构造方法,将需要反序列化的数据读取出来。注意:读取数据的顺序必须与写入数据的顺序一致。

5、实现Parcelable接口中的CREATOR静态变量,用于反序列化数据。其中包含两个抽象方法createFromParcel(Parcel source)和newArray(int size)。

三、使用Parcelable序列化对象

使用Parcelable序列化Java对象需要以下几个步骤:

1、将需要传递的Java对象打包成Parcel对象:

User user = new User("Tom", 25);
Parcel parcel = Parcel.obtain();
user.writeToParcel(parcel, 0);

2、通过Bundle将Parcel对象传递给需要的组件,例如Activity:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("user", parcel);
intent.putExtras(bundle);
startActivity(intent);

3、将Parcel对象传递给需要的组件:

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
Parcel parcel = bundle.getParcelable("user");
User user = User.CREATOR.createFromParcel(parcel);

四、总结

Parcelable是Android特有的一种序列化方法,与Java的Serializable相比,Parcelable更快更轻巧,并且适合在内存之间传递对象。使用Parcelable序列化Java对象需要实现Parcelable接口,并实现writeToParcel()和createFromParcel()这两个方法。将需要传递的Java对象打包成Parcel对象,通过Bundle将Parcel对象传递给需要的组件,将Parcel对象传递给需要的组件并进行反序列化即可。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/293479.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-26 13:14
下一篇 2024-12-26 13:14

相关推荐

  • 金额选择性序列化

    本文将从多个方面对金额选择性序列化进行详细阐述,包括其定义、使用场景、实现方法等。 一、定义 金额选择性序列化指根据传入的金额值,选择是否进行序列化,以达到减少数据传输的目的。在实…

    编程 2025-04-29
  • 面向对象编程、类和对象

    面向对象编程(Object-Oriented Programming, OOP)是一种编程方法,它将现实世界中的事物抽象为对象(Object),对象的属性和方法被封装成类(Clas…

    编程 2025-04-29
  • 理解Java反序列化(Java Deserialization Vulnerability)

    本文将从多个方面深入探讨Java反序列化漏洞,对于笔者所总结的经验和教训,以及掌握Java反序列化的设计模式、最佳实践和防范措施。 一、Java反序列化漏洞概述 Java反序列化漏…

    编程 2025-04-28
  • Mapster:一个高性能的对象映射库

    本文将深入介绍furion.extras.objectmapper.mapster,一个高性能的对象映射库,解释它是如何工作的以及如何在你的项目中使用它。 一、轻松地实现对象之间的…

    编程 2025-04-28
  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • Python返回对象类型

    Python是一种动态、解释型、高级编程语言。Python是一种面向对象的语言,即所有的一切都是一个对象。 一、基本类型 Python中的基本类型有整数int、浮点数float、布…

    编程 2025-04-28
  • Python中通过对象不能调用类方法和静态方法的解析

    当我们在使用Python编写程序时,可能会遇到通过对象调用类方法和静态方法失败的问题,那么这是为什么呢?接下来,我们将从多个方面对这个问题进行详细解析。 一、类方法和静态方法的定义…

    编程 2025-04-27
  • Python内置函数——查看对象内存

    本文将介绍Python内置函数中,在开发中查看对象内存的相关函数。 一、id()函数 id()函数是Python内置函数,用于返回对象的唯一标识符,也就是对象在内存中的地址。 nu…

    编程 2025-04-27
  • Android Studio HUD 实现指南

    本文将会以实例来详细阐述如何在 Android Studio 中使用 HUD 功能实现菊花等待指示器的效果。 一、引入依赖库 首先,我们需要在 build.gradle 文件中引入…

    编程 2025-04-27

发表回复

登录后才能评论