序列化和反序列化就是把数据结构活着对象转化成二进制串和把二进制串转化成数据结构和对象的过程
Serializable
1.反序列化过程中,会调用无参构造函数进行创建所以必须创建
2.一个类实现序列化,他的子类也是可以序列化的
serialVersionUID
版本号概念,如果你修改了此类,必须修改版本号,不然会报错,另外一个原因是因为JVM不同,出现因类版本
不兼容而无法正确反序列化的现象出现
Serializable和Parcelable
Serializable开销大,因为他在序列化过程中使用了反射机制,产生了大量临时变量,从而导致频繁的gc,在读写过程中通过io流把数据写在硬盘或者网络上
Parcelable
Parcelable是以ibinder为信息载体在开销上比较小,在内存之间进行数据传递的,但他对数据持久化和网络传输操作比较复杂,因为不同android版本中parceable可能会不同
Serializable序列化流程
image.png对象序列化的时候会通过反射获取到属性然后存下来,反序列化的时候直接通过object强转
自定义序列化Externalizable
1.android里面为什么设计bunlde而不是直接使用map结构
bundle里面使用arraymap实现的,内部是两个数组,内部使用二分法对key进行排序,查找,只适合用于小数据操作,数据量大的情况下会退化,hashmap使用数组和链表,在数据量小情况下占用更多的数据。另外一个原因是hashmap序列化用的Serializable,而Bundle则是使用Parcelable
2.Android中Intent/Bundle的通信原理及大小限制,为什么intent不能直接在组件间传递对象而要通过序列化
android调用intent会进入ams进程,也就是说intent带的数据要在不同进程间传递,java对象是没办法传输的所以要进行序列化,bundle大小限制是由binder机制进行传递的,最大好像就是4m
3.反序列化的时候会重新调用构造函数嘛
不会,因为直接从二进制直接解析出来的,通过object强转,已经不是原来的那个对象了,是深拷贝
4.某些成员不要序列化用什么
trasient修饰变量
5.如果类中一个成员比那两未实现可序列化接口,会发生什么
报错,notserialzableexception
6.如果类是可序列化的, 但其超类不是, 则反序列化后从超级类继承的实例 变量的状态如何?
从超类继承的实例变量可以初始化,其他变量为属性的默认值
网友评论