IPC主要包括Serializable接口,Parcelable接口以及Binder。

1.Serializable是java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。使用Serializable来实现序列化相当简单,只需要在类中申明如下指定一个表示符即可实现默认序列化过程。

private static final long serialVersionUID=8711368828010083044L;

在android中也提供了新的序列化,那就是Parcelable接口,使用Parcelable来实现对象的序列化,其过程要稍微的复杂一些。上面提到,想让一个对象实现序列化,只需要实现Serializable接口并指明一个serialVersionUID即可,实际上,甚至这个serialVersionUID也不是必须的,我们不需要声明这个UID同样也可以实现序列化,但是这将会对反序列化过程产生影响,具体什么影响后面在介绍。User类就是一个实现Serializable接口的类,它是可以被序列化和反序列化的。

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

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

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

上诉代码演示了采用Serializable方式序列化对象典型过程,很简单,只需要把实现了Serializable接口的User对象写到文件中就可以快速恢复了,恢复后的对象newUser和user的内容完全一样,但两者并不是同一个对象。

刚开始提到,即使不指定UID也可以实现序列化,那到底要不要指定呢?如果指定的话,UID后面那一长串数字又是什么含义呢?我们要明白,系统既然提供了这个UID,那么它必须是有用的。这个UID实际上是来辅助序列化和反序列化过程的,原则上序列化后的数据中的UID只有和当前类的UID相同才能够正常的被序列化。UID的详细工作机制是这样的:序列化的时候系统会把当前类的UID写入序列化的文件中(也可能是其他中介),当反序列化的时候系统会去检测文件中的UID,看它是否和当前类的UID一致,如果一致就说明序列化的类的版本和当前类的版本是相同的,这个时候可以反序列化成功;否则就说明当前类和序列化的类相比发生了某些变化,比如成员变量的数量,类型可能发生改变,这个时候无法正常序列化,回报UID不同的错误。

一般来说,我们应该手动指定UID的值,这样在序列化和反序列化是两者的UID是相同,可以正常的进行反序列化。如果不手动指定UID,当你增加或删除某些成员变量的时候,那么系统会重新计算当前类的hash值并把它赋予给UID,这个时候当前的UID就和反序列化的UID就不同了,于是反序列化失败,程序crash掉了,但指定了就不会crash。当然,如果类的结构发生的改变,比如修改了类名,修改了成语变量的类型,这个时候尽管UID是一致的,反序列化还是会失败,因为类的结构有毁灭性的改变,根本无法从来版本的数据中还原出一个新的类结构对象。

根据上面的分析,我们可以知道手动给定UID和不给UID的区别。以下两点需要特别提一下,首先静态成员变量属于类不属于对象,所以不参加序列化过程;其次用transient关键字标记的成员变量不参与序列化过程。

另外,系统默认的序列化过程是可以改变的,通过实现如下两个方法即可重写系统默认的序列化和反序列化过程。

private void writeObject(ObjectOutputStream out)throws IOException{}private void readObject(ObjectInputStream in)throws IOException ,ClassNotFoundException{}

IPC基础概念介绍第一篇(Serializable接口)相关推荐

  1. 自己动手实现蓝牙MESH应用系列 | 第一篇:蓝牙MESH基础概念介绍

    文章目录 1. 前言 2. 概述 2.1. 蓝牙风格(Flavors) 2.2. mesh网络的动机 2.3. mesh网络中的消息传输方式 2.3.1. 以消息为中心的通信 - 发布/订阅(publ ...

  2. 2.IPC基础概念------Serializable接口

    IPC基础概念主要包含三方面内容:Serializable接口.Parcelable接口以及Binder,Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过In ...

  3. 区块链教程(二):基础概念介绍

    注:本教程为技术教程,不谈论且不涉及炒作任何数字货币 本系列重点在于以太坊基础知识.以太坊客户端以及以太坊solidity编程,因此博客重点在于以太坊核心知识点的掌握,区块链部分的基础知识可以作为补充 ...

  4. 如何介绍世界上第一台计算机,[世界第一台计算机]计算机简单的自我介绍第一篇...

    无论是找工作还是申请学校,面试都是大家必经的一个过程.而每一场面试几乎都是以"自我介绍"开始的.那么面试计算机应该怎么自我介绍?以下是答.案.网 ZqNf.Com小编为您整理的计算 ...

  5. 物流仓储管理系统(wms)基础概念介绍[临沂艾思app开发]

    物流仓储管理系统(wms)基础概念介绍: 物流仓储管理系统(wms)是一套基于追溯系统成品的多级渠道仓库管理流程,能完成从工厂到终端的多级仓库物流的管理及产品全生命周期流通的追溯管理,并以产品追溯码为 ...

  6. 第一节:基础概念介绍(黄老师)

    最近偶然在网上看到韦东山老师的课程--7天物联网智能家居实战训练,常常在关于Linux学习或者嵌入式学习的文章中看到韦东山老师的名字,但是还从来没有实际听过,因为大家都说要先从51,再过渡到STM32 ...

  7. SEO究竟是什么?SEO的相关基础概念介绍

    可能对于刚接触优化的新手来说,要明白SEO是什么,只有了解之后才能有进一步的学习以及提升.在互联网搜索引擎中,已经有了大量的相关资料以及定义.不同的人会用不同的语言来解释SEO是什么,但是最终的结果是 ...

  8. javascript基础入门_javascript基础入门学习第一篇

    今天主要讲述js,在讲述今天的编程知识之前,我们要对C++做一个说明因为一些原因C的知识不做更新了,下面将讲述js的编程知识,首先需要了解的是js是一个脚本语言不是编程语言这两者的区别就是一个需要依附 ...

  9. Tekton基础概念介绍

    本文来介绍下Tekton基础概念 文章目录 概述 概述

最新文章

  1. Future is IMPACT! 未来就是影响力!(演讲稿)
  2. CentOS Linux解决Device eth0 does not seem to be present
  3. CF1131E String Multiplication(???)
  4. VMware ESX 主机的网卡负载均衡配置3种方法
  5. php中 一行上显示多个数字,php – 打印图案以显示最多5行和5列的数字,如5 4 3 2 1和下一行4 3 2 1 5到第5行...
  6. 机器学习:正则化原理总结
  7. merge函数_c语言中的merge函数
  8. mysql scrapy 重复数据_小心避坑:MySQL分页时使用 limit+order by 会出现数据重复问题...
  9. 【Linux常用指令整理8】别名、输入/输出重定向、管道、命令连接符、命令替换符...
  10. 2019年最新移动互联网全行业排行榜!
  11. 集体智慧编程——协同过滤
  12. 手顺解决 Foxmail7.2 无法搜索“主题”和“全文”,只能搜“发件人”和“收件人” 问题
  13. 宝塔Linux面板如何进入,云服务器怎么进入宝塔面板
  14. 经典游戏PK:魔兽争霸VS星际争霸VS红警
  15. outlook配置126邮箱
  16. android源码编译烧鸡,板栗烧鸡的做法图文
  17. 单片机、FPGA、DSP、ASIC、ARM9的优缺点分析
  18. LeetCode162数组寻峰问题
  19. iframe中加载html,在iframe中加载外部html并访问内容
  20. Oracle Sqlplus命令登录的几种方式

热门文章

  1. Java正则表达式学习及使用案例干货
  2. matlab实验报告井字棋,一字棋实验报告
  3. 解决Zotero APA格式显DOI问题
  4. 3600插b450i开不了机_学生党便携主机,Ryzen 5 3600+技嘉B450i+Radeon RX5700测试篇
  5. ci/cd自动化测试_CI / CD管道加快测试自动化的16种最佳实践
  6. 企业直播营销有什么优势
  7. 华为手机安装linux,安装linux 云服务器
  8. C语言--第n小的质数
  9. NOI.5.44第n小的质数
  10. 域名能生成多少二级域名_15个最佳域名生成器,可帮助您选择域名(FAST)