Android 学习笔记(7)之序列化总结

1,单例模式 (私有化类中的构造方法)
懒汉  使用时创建  getInstance 里面new 注意同步
饿汉  一开始就创建  类static属性里面new   getInstance返回实例
静态内部类, 静态内部类里面new  通过类.的方式调用  如Single.SingleHandler.single
枚举  枚举类里构造方法私有

2,序列化(数据转二进制)
进程间通信系统底层只认识字节序列
Java  Serializable
android  Parcelable
序列化  用于网络传输,数据持久化  编码Encode
反序列化  从网络,磁盘读取字节码还原成对象 解码(Decode)
目的:
1,永久保存对象数据
2,网上传输
3,进程间传递数据(Activity到另一个Activity)
注意
在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了.

3,性能
空间开销   原有的数据上加上描述字段,以为反序列化解析之用 磁盘网络空间压力增加
时间开销   复杂的协议,解析时间增加

4,常见序列化协议
1,xml soap(基于xml)
2,json  更简洁,协议简单,解析速度快
3,ProtoBuf 更小,3-10倍,更快20-100倍

5,Android 序列化  
Serializable
Serializable 用来标识当前类可以被 ObjectOutputStream 序列化,以及被 ObjectInputStream 反序列化。
一个实现序列化的类,它的子类也是可序列化的
静态成员变量属于类不属于对象,所以不会参与序列化
serialVersionUID 版本兼容

6,序列化源码
transient  修饰的不能被序列化 (比如密码属性不序列化)
在被反序列化后,transient 变量的值被设为初始值
静态成员不会被序列化  对象序列化保存的是对象的“状态”

Externalizable接口
这个接口的writeExternal()和readExternal()方法可以指定序列化哪些属性;
重写
writeExternal
readExternal

- writeReplace 先于writeObject
- readResolve后于readObject
序列化会导致单例失效

Parcelable接口 
Parcelable通过Parcel实现了read和write的方法,从而实现序列化和反序列化,
Parcel (序列化数据打包)

实现类必须有一个 Creator 属性
两个方法  将Parcel还原成Java对象
反序列化这个数组
7,两个接口区别
Serializable性能分析 
开销大,使用反射产生大量的临时变量
IO流的形式
Parcelable则是以IBinder作为信息载体
在内存上开销比较小
8,使用场景
内存之间传递数据采用Parcelable
数据进行持久化或者网络传输时操作复杂,一般这个时候推荐使用Serializable。

9,SQLite 与 SharedPreferences
10面试
Android里面为什么要设计出Bundle而不是直接用Map结构
Bundle -> ArrayMap  两个数组  一个存存储对象数据对应下标  一个对象数组保存key和value   内部使用二分法对key进行排序 二分法查找,适合小数据量操作
而HashMap内部则是数组+链表结构 
HashMap使用Serializable进行序列化
而Bundle则是使用Parcelable进行序列 速度快

Android中Intent/Bundle的通信原理及大小限制
Binder 机制进行数据传送的
Binder 的缓冲区是有大小限制的(有的是2M) 一个进程默认16个binder线程,每个差不多128k,数据太大会提示
你看到 The Binder transaction failed because it was too large 这类 TransactionTooLargeException 异常时

为何Intent不能直接在组件间传递对象而要通过序列化机制?
intent 启动其他组件时,会离开当前应用程序进程,进入ActivityManagerService进程
Intent所携带的数据要能够在不同进程间传输
Linux系统,不同进程之间的java对象是无法传输
从而实现对象在 应用程序进程 和 ActivityManagerService进程 之间传输

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值