Android:可打包和可序列化之间的区别?

2023-12-02

为什么Android提供2个接口用于序列化对象?可序列化对象是否与 Android 互操作Binder和 AIDL 文件?


在 Android 中,我们不能只将对象传递给 Activity。为此,对象必须实现Serializable or Parcelable界面。

可串行化

Serializable是一个标准的Java接口。你只需实施Serializable接口并添加覆盖方法。这种方法的问题是使用了反射,并且这是一个缓慢的过程。此方法创建了大量临时对象并导致大量垃圾收集。然而,Serializable接口更容易实现。

看下面的例子(可序列化):

// MyObjects Serializable class

import java.io.Serializable;
import java.util.ArrayList;
import java.util.TreeMap;

import android.os.Parcel;
import android.os.Parcelable;

public class MyObjects implements Serializable {

    private String name;
    private int age;
    public ArrayList<String> address;

    public MyObjects(String name, int age, ArrayList<String> address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public ArrayList<String> getAddress() {
        if (!(address == null))
            return address;
        else
            return new ArrayList<String>();
    }

    public String getName() {
        return name;
    }

    // return age
    public int getAge() {
        return age;
    }
}
// MyObjects instance
MyObjects mObjects = new MyObjects("name", "age", "Address array here");

// Passing MyObjects instance via intent
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects)    mIntent.getSerializableExtra("UniqueKey");

可分包

Parcelable过程比Serializable。原因之一是我们明确了序列化过程,而不是使用反射来推断它。按理说,代码已为此目的进行了大量优化。

看下面的例子(Parcelable):

// MyObjects Parcelable class

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class MyObjects implements Parcelable {

    private int age;
    private String name;
    private ArrayList<String> address;

    public MyObjects(String name, int age, ArrayList<String> address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public MyObjects(Parcel source) {
        age = source.readInt();
        name = source.readString();
        address = source.createStringArrayList();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name);
        dest.writeStringList(address);
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public ArrayList<String> getAddress() {
        if (!(address == null))
            return address;
        else
            return new ArrayList<String>();
    }

    public static final Creator<MyObjects> CREATOR = new Creator<MyObjects>() {
        @Override
        public MyObjects[] newArray(int size) {
            return new MyObjects[size];
        }

        @Override
        public MyObjects createFromParcel(Parcel source) {
            return new MyObjects(source);
        }
    };
}
// MyObjects instance
MyObjects mObjects = new MyObjects("name", "age", "Address array here");

// Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects) mIntent.getParcelableExtra("UniqueKey");

你可以通过ArrayList可打包对象如下:

// Array of MyObjects
ArrayList<MyObjects> mUsers;

// Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putParcelableArrayListExtra("UniqueKey", mUsers);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
ArrayList<MyObjects> mUsers = mIntent.getParcelableArrayList("UniqueKey");

结论

  1. ParcelableSerializable界面
  2. Parcelable与相比,接口需要更多时间来实现Serializable界面
  3. Serializable接口更容易实现
  4. Serializable接口创建了大量临时对象并导致大量垃圾收集
  5. Parcelableandroid中可以通过Intent传递数组
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:可打包和可序列化之间的区别? 的相关文章

  • 我用 MediaRecorder 录制的文件无法播放

    我正在使用 MediaRecoder 录制声音 但录制完成后无法播放 我尝试使用Google Play Music ES Media Player 甚至将其上传到电脑并尝试使用Winamp打开它 没什么玩的了 AUDIO RECORDER
  • 如何更改我的应用程序的语言[重复]

    这个问题在这里已经有答案了 可能的重复 在 Android 中以编程方式更改语言 https stackoverflow com questions 2900023 change language programatically in an
  • 选项 多个活动通用的菜单项

    安卓系统设计指南 http developer android com design patterns help html表示 帮助 应始终放置为溢出菜单的最后一项 它不应该出现在 ActionBar 中 而且 它应该出现在每个活动中 以便
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • Facebook 和 google 登录不适用于 beta 测试 APK

    Google 和 Facebook 登录在 Android Studio Tools 中工作正常 但它们不适用于测试版本或 Beta 测试 因此请给我任何解决此问题的线索 联系谷歌支持后我已经解决了这个问题 以下是此问题的修复方法 请按照步
  • Android 背景 + 文本 + 按钮图标

    我想要一个图像设置为文本的背景 并在文本的左侧设置一个图标 在iPhone中非常简单 但不知道如何在Android上做到这一点 调整按钮的大小并保持图标 文本的位置和距离正确 iPhone 安卓我有这个 xml代码是
  • Maven:如何获取捆绑在包中的 .so 库

    我有一个带有 jar 和 so 文件的第三方库 我配置了 pom xml 如下
  • 用dagger 2查看依赖注入

    我有一个自定义视图扩展TextView 我应该在哪里调用我的组件来注入视图 component inject customTextView 因此 我发现我需要在自定义视图的构造函数中添加注入 在所有视图中 或者使一个调用另一个 Exampl
  • 如何在Android Studio中关联.mp3文件

    我想根据列表视图项单击播放 mp3 文件 但是根据我的代码 我运行我的应用程序 出现此窗口 因此由于缺少音频选项 我真的不知道需要选择其中哪一个为了关联我的 mp3 文件 mainList setOnItemClickListener ne
  • NestedScrollView 中带有 RecyclerView 的 ItemTouchHelper:拖动滚动不起作用

    我已经实现了 ItemTouchHelper 如本文所述 https medium com ipaulpro drag and swipe with recyclerview b9456d2b1aaf k7xm7amxi https med
  • 横向模式下视频视图不是全屏

    我正在使用用 xml 设计的视频视图 该视频在纵向模式下为全屏 但当切换到横向模式时 它会左对齐 并且宽度和高度都会换行 而不是全屏 我参考了这些 但仍然没有解决这个问题 全屏视频视图未居中 https stackoverflow com
  • 使用react-native使用WebView设置用户代理

    我想修改 WebView 中的用户代理字符串 以便在服务器端我可以检测到请求来自我的反应本机应用程序 我想使用 WebView 中的 source 属性来做到这一点 对于 IOS 和 Android 我该如何执行此操作 您只需将其设置为 W
  • 如何在 Jetpack Compose 中集成自动填充

    我想在我的应用程序中提供一些自动填充功能 电子邮件和密码 该功能完全使用 Jetpack compose 编写 我碰到这篇博文 https bryanherbst com 2021 04 13 compose autofill and 这个
  • 使用 Android 2.x 进行实时音频流传输

    我需要在 2 x 及更高版本的设备上播放直播 This http developer android com guide appendix media formats html声明不可能在 Android 2 x 的设备上播放直播 我在这里
  • 使用 greenDao 动态查询

    我需要验证一些条件来创建完整的查询 QueryBuilder qb getMyObjDao queryBuilder if 某些条件 qb where MyObjDao Properties Prop1 eq someValue elseq
  • recyclerview 未连接适配器;跳过布局

    刚刚实施RecyclerView在我的代码中 替换ListView 一切正常 显示数据 但正在记录错误消息 15 25 53 476 E RecyclerView No adapter attached skipping layout 15
  • Android Mediaplayer:下载媒体文件的 setDataSource 问题

    我有一个可以录制和播放音频文件的应用程序 一些音频文件是使用 httpclient 使用简单的标准 http 下载来下载的 很长一段时间以来 它就像一种魅力 现在我突然无法播放我下载的文件 该堆栈失败 我将文件存储在 SDCard 上 并且
  • 了解 FTS3/FTS4:什么是虚拟表并从中搜索具有可搜索的非虚拟表?

    阅读 SQLite3 的 FTS3 FTS4 文档的第一部分后 我现在感到非常困惑 我感到困惑的原因是散布在网络上的示例 我相信它没有涵盖所有可能的用例 另一个原因是我目前所处的情况 话虽如此 我有一个名为 Note 的表 其中包含两个类型
  • 以编程方式暂时禁用自动更新

    我有一个自行车计算机应用程序 可以在用户骑行时记录数据 我有一位用户报告了一个我没有考虑到的问题 他出去进行了一次长途骑行 100 多英里 但在外出记录数据时 该应用程序通过 Google Play 自动更新进行了更新 不幸的是 这导致应用
  • 如何获取 EC2 实例的 CloudWatch 指标数据

    我想获取我的 EC2 实例的 Cloudmetrics 数据 以便我可以使用这些数据绘制图表并将其显示在我的 Android 设备上 我怎么做 有相同的示例程序或教程吗 提前致谢 这就是我正在做的 private static void f

随机推荐

  • 将 SKSpriteNode 移动到触摸位置

    上面是我的游戏的图像 一个自上而下的游戏 无论玩家触摸屏幕上的哪个位置 我都希望子弹在一段时间内到达该位置 我还希望玩家能够在屏幕上拖动手指 同样的事情也会发生 这样玩家就不必每次想要射击时都触摸屏幕 到目前为止我已经尝试了一些不同的东西
  • IE 安全设​​置设置为高 - javascript 不起作用

    一旦我将 IE 安全设 置设置为高 页面上的 javascript 就会停止执行 它不会抛出错误或任何东西 甚至警报也不起作用 如果我将安全设置设置回中等 一切都会正常进行 有人经历过这样的事情吗 此行为是设计使然 The High安全设置
  • Android 日期选择器 API 级别 11 之前的最小最大日期

    我试图将 Android 中日期选择器的最小和最大日期设置为 API 级别 11 之前 我使用了以下代码 mDatePickerField startDatePickerDialog getClass getDeclaredField mD
  • 在 Apache Felix OSGI 中安装并运行 Web 管理控制台

    我正在尝试在 Apache Felix 4 2 1 中安装并运行 Apache Felix Web 管理控制台 4 2 0 但它不起作用 我已经安装了 Felix Http Jetty 2 2 1 捆绑包 Felic Configurati
  • Internet Explorer 和 Edge 中的视频、内存管理问题,导致页面上的许多视频显示暗/黑和/或无法播放

    我们有一个页面包含 77 个左右的视频缩略图 当视频缩略图悬停在上方时 视频开始在缩略图空间内播放 当许多 8 到 60 个 具体取决于系统 浏览器 悬停在它们上方时 就会出现问题 视频开始播放不正确或不播放 基本上 平坦 冗余区域全部变暗
  • 如何从 CreateProcessWithLogonW 获取标准输出?

    我正在使用来自的代码http www pinvoke net default aspx advapi32 createprocesswithlogonw 如何从标准输出获取字符串形式的输出 就像您在命令窗口中交互运行它时显示的内容一样 ca
  • 如何使用 jQuery 以编程方式触发链接点击?

    如何使用 jQuery 以编程方式触发链接点击 your link id click 看看优秀的jquerydocs了解更多信息
  • MySQL 相当于 PostgreSQL 的 dblink 模块?

    PostgreSQL 的dblink模块允许编写针对远程 PostgreSQL 数据库执行其他 SQL 语句的 SQL 语句 MySQL 中是否有相当于 PostgreSQL 的 dblink 的工具 不完全是 然而 有FEDERATED存
  • 在 python 中,如何将 c++ 共享库的 stdout 捕获到变量

    由于其他一些原因 我使用的 C 共享库将一些文本输出到标准输出 在 python 中 我想捕获输出并保存到变量 关于重定向标准输出有很多类似的问题 但在我的代码中不起作用 例子 抑制模块调用外部库的输出 1 import sys 2 imp
  • Symfony2 - Doctrine2:跨数据库连接列抛出映射异常

    您好 想要在两个实体之间建立连接 这些实体位于不同的数据库中 这是我设置数据库配置的方法 doctrine dbal default connection default connections default driver databas
  • 如何在 jQuery 悬停菜单上允许默认子菜单

    这要从一个相关问题 在得到一个出色的答案后 我遇到了一个不可预见的功能差距 如何显示默认打开的菜单 更具体地说 如果用户登陆我的子导航中存在的页面 我希望打开该子导航并突出显示当前页面 如果他们使用菜单浏览 菜单会相应更改 但如果他们不进行
  • 如何有效地仅读取文本文件的最后一行

    需要从大日志文件中获取最后一行 最好的方法是什么 您想使用向后读取文件ReverseLineReader 如何在C 中使用迭代器反向读取文本文件 然后运行 Take 1 on it var lines new ReverseLineRead
  • 将标注添加到 Highcharts - 堆叠栏

    我正在尝试使用来自的堆叠条形图制作年龄时间表高图表 我想要有多个指向时间线中数据点的调用 我本来打算使用工具提示 但我需要始终显示所有工具提示 并且每个工具提示需要不同的内容 所以我认为使用呼叫会是更好的解决方案 如何确保我的标注指向我需要
  • 无法使用 OpenSSL 的 ssl.SSLContext() 在 Python 客户端中接收对等证书

    我是 Windows 用户 我用Python 3 6 5我导入这个版本的 OpenSSLOpenSSL 1 0 2k 我需要为 python TLS 客户端编写一个脚本 我可以根据支持的 TLS 版本 密码套件和其他配置进行自定义 客户端应
  • 为什么节点 REPL 中未定义 __dirname?

    从节点手册中我看到我可以使用以下命令获取文件的目录 dirname 但从 REPL 来看 这似乎是未定义的 这是我的误解还是错误在哪里 node gt console log dirname ReferenceError dirname i
  • JavaScript 无法通过 Rails 中的引导模板运行

    我创建了一个新的 Rails 应用程序并安装了所有必要的 gem 添加了所有文件 更新了 application js 文件 一切正常 但由于某种原因 所有与 javascript 相关的东西都不起作用 我使用这个模板 https star
  • Discord.py:想要将 message.content 读为小写,.lower() 不起作用

    import discord import asyncio import sys from discord ext import commands client commands Bot command prefix id client g
  • 检测是否安装了从右到左的语言

    检测主机 Windows 操作系统上是否安装了从右到左语言的最简单方法是什么 我需要这个才能知道 LTR 标记是否会显示为正方形 或者在主机操作系统上是否正常工作 可能是非托管 API 例如是否有效语言组 有效区域设置名称 or 有效区域设
  • swift 中 UITableView 的动态数据源/委托

    我需要根据某些条件设置不同的对象作为表视图的数据源和委托 但我无法分配表视图的数据源 委托 因为它会引发一些错误 无法分配 NSObject 类型的值 为 UITableViewDelegate 类型的值 我确实检查过this问答但这没有用
  • Android:可打包和可序列化之间的区别?

    为什么Android提供2个接口用于序列化对象 可序列化对象是否与 Android 互操作Binder和 AIDL 文件 在 Android 中 我们不能只将对象传递给 Activity 为此 对象必须实现Serializable or P