IPC基础概念主要包含三方面内容:Serializable接口、Parcelable接口以及Binder,Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时需要使用Serializable或者Parcelable。还有我们需要把对象持久化到存储设备上或者通过网络传输给其他客户端,也需要Serializable来完成对象的持久化,下面先介绍如何使用Serializable来完成对象的序列化。
2.1 Serializable接口
Serializable是Java提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化的操作。使用Serializable实现序列化相当简单,只需要在类声明中指定一个类似下面的表示即可自动实现默认的序列化:

private static final long serialVersionUID = 8711368828010083044L

在Android中提供了新的序列化方式,那就是Parcelable接口,使用Parcelable来实现对象的序列号,过程要稍微复杂。想让一个对象实现序列化,只需要这个类实现Serializable接口并声明一个serialVersionUID即可,实际上这个serialVersionUID 也不是必须的,不必声明也可以实现序列化,但是这将对反序列化产生影响。User类就是一个实现了Serializable接口的类,它是可以被序列化和反序列化的:

public class User implements Serializable{private static final long serialVersionUID = 519067123721295773L;
public int userId;
public String userName;
public boolean isMale;
....
}

通过Serializable方式来实现对象的序列化,实现起来非常简单,几乎所有工作都被系统自动完成了。如何进行对象的序列化和反序列化也非常简单,只需要采用ObjectOutputStream和ObjectIntputStream即可轻松实现。

//序列化过程
User user = new User(0,"jake",true);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
out.writeObject(user);
out.close();
//反序列化过程
ObjectIntputStream in = new ObjectIntputStream(new FileIntputStream("cache.txt"));
User newUser = (User) in.readObject();
in.close();

上述代码演示了采用Serializable方式序列化对象的典型过程,很简单,只需要把实现Serializable接口的User对象写到文件中就可以快速恢复了,恢复后的对象newUser和user的内容完全一样,但是两者并不是同一个对象。
之前提到,即使不指定serialVersionUID也可以实现序列化,那到底要不要指定呢?如果指定的话,serialVersionUID后面那一串数字是什么含义呢?这个serialVersionUID是用来辅助序列化和反序列化过程的,原则上序列化后的数据中的serialVersionUID只有和当前类的serialVersionUID相同才能够正常被反序列化。serialVersionUID的详细工作机制:序列化时系统把当前类的serialVersionUID写入序列化文件中,当反序列化的时候系统会检测文件中的serialVersionUID,看它是否和当前类serialVersionUID一致,如果一致就说明序列化的类的版本和当前类的版本是相同的,这个时候可以成功反序列化;否则就说明当前类和序列化的类相比发生了某些变换,比如成员变量的数量、类型可能发生了改变,这个时候是无法正常反序列化的,因此会报如下错误:

java.io.InvalidClassException:Main;local class incompatible:stream
classdesc serialVersionUID = 8711368828010083044,local class serialVersionUID=8711368828010083043

一般来说,我们应该手动指定serialVersionUID的值,比如1L,也可以让Eclipse根据当前类的结构自动去生成它的hash值,这样序列化和反序列化时两者的serialVersionUID是相同的,可以正常序列化和反序列化。如果不手工指定serialVersionUID的值,反序列化时当前类有所改变,比如增加或者删除了某些成员变量,那么系统就会重新计算当前类的hash值并把它赋值给serialVersionUID,这个时候当前类的serialVersionUID就和反序列化的serialVersionUID不一致,反序列化失败,程序就会crash。所以,手动指定serialVersionUID可以在很大程度上避免反序列化的失败。
给serialVersionUID指定为1L或者采用Eclipse根据当前类结构去生成的hash值,这两者并没有本质区别,效果完全一样。注:首先静态成员变量属于类不属于对象,所以不会参与序列化;其次用transient关键字标记的成员变量不会参与序列化。

2.IPC基础概念------Serializable接口相关推荐

  1. IPC基础概念介绍第一篇(Serializable接口)

    IPC主要包括Serializable接口,Parcelable接口以及Binder. 1.Serializable是java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操 ...

  2. 【Web接口测试_基础概念】接口概念、接口分类、接口定义、接口规范、接口方法、接口用例设计整理

    [接口基础] 1.接口测试概念 1.1 基础概念 接口的定义:接口英文"interface",表示某个对象和外界交互的部分. 1.2接口的分类: ①用户UI接口,表示提供给用户操作 ...

  3. java serializable_Java基础之Serializable接口

    Serializable接口介绍 Serializable是java.io包中定义的.用于实现Java类的序列化操作而提供的一个语义级别的接口.Serializable序列化接口没有任何方法或者字段, ...

  4. java serializable 源码_Java源码分析之-Serializable接口

    一.基本概念 Serializable接口: 1. 实现了Serializable接口的类,可以进行序列化和反序列化:没有实现这个接口的类的任何(state)状态/域或者属性值不能被序列化 2. Al ...

  5. 自动化(Automation)基础概念:二次开发接口(API)与插件(Addin)

    二次开发接口(API)与插件(Addin) 许式伟 (版权声明) 2007-4-20 在前文,我们已经解释了: 自动化(Automation)基础概念:COM组件(Component)与接口(Inte ...

  6. 逗比的输入法实现(二):基础概念和常用接口

    为什么叫 Meow?因为这是给猫用的输入法... 目录 (一):基本情况 (二):基础概念和常用接口 (三):整体构架 (四):编辑和候选 (五):界面管理和无界面模式 (六):词库和候选算法 (七) ...

  7. 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念

    linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  8. Android --- Serializable 接口与 Parcelable 接口的使用方法和区别,怎么选择?

    文章目录 一.前言: 二.Serializable 接口 三.Parcelable 接口 四.两种接口怎么选择 一.前言: 本节主要讲解 IPC 中的基本概念,Serializable 接口与 Par ...

  9. 【Alljoyn】Alljoyn学习笔记五 AllJoyn开源技术基础概念解析

    AllJoyn开源技术基础概念解析 摘要: 总线(Bus) 实现P2P通信的基础 AllJoyn 的底层协议类似于D-Bus,相当于是跨设备分布式的 D-Bus 总线附件(Bus Attachment ...

最新文章

  1. python做数据分析的包_用Python做数据分析,Numpy,Pandas,matp
  2. 重启网卡服务_Linux下查看不到物理网卡配置
  3. Field Service Center Customization
  4. div中插入图片_Web前端开发基础知识,设置网页背景图,如何在网页中插入图片...
  5. dart系列之:dart代码规范实践指南
  6. 2019 GDUT Rating Contest II : A. Taming the Herd
  7. senborn绘制混淆矩阵
  8. cognos数据源配置修改oracle,Cognos 新建数据源报错(原创)
  9. 高阶篇:4.1.2)QFDII(设计要求逐层分配给各零件)
  10. MRP里如何预测lead time :Approaches for the Prediction of Lead Times in an Engineer to Order Environment
  11. windows图片查看器背景颜色更改
  12. 2018校园招聘笔经面经合集:算法,机器学习,大数据方向
  13. 换个方式认识一下——微信公众号搜索公众号列表 API
  14. ai个性化 国庆 头像 合成
  15. 物联网在车联网中的应用
  16. 分支定界法需要注意的是什么
  17. mysql百万数据join_MySQL百万级、千万级数据多表关联SQL语句调优
  18. 绘图库Matplotlib | Python技能树征题
  19. R语言实战-读书笔记(第1 章 R语言介绍)
  20. 关于自然数系统的无矛盾性

热门文章

  1. 发票管理小工具二:获取发票内容
  2. qpushbutton 设置字体大小_QT设置QPushButton的Text字体颜色 | 学步园
  3. 单片机脉冲微盘_单片机产生脉冲波
  4. HTML5网页设计练习
  5. 计算机软件行业市场规模,行业深度!一文带你看懂2021年中国工业软件行业市场规模、竞争格局及发展趋势...
  6. 网络安全学习记录-8
  7. 恺撒密码 python
  8. 有关神经网络的训练算法,神经网络训练计算器app
  9. 32位uefi引导64位Linux,维护版win8pe(32位+64位+纯64位,支持BIOS+EFI)
  10. 古典密码的演化 (一)— 密码学复习(二)