transient笔记
2020-05-17 本文已影响0人
ShihChieh_Ma
老年人记性不好,最近看hashmap源码,才注意到transient Node<K,V>[] table这个玩意用transient修饰着,上次是什么时候看这源码来这?这玩意干啥用来着?又忘了,还是做个笔记吧,忘性太大了..
transient 关键字作用:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化.
序列化有两种我都先写个demo看看结果
例子:
Serializable
image.pngimage.png image.png
image.png
Parcelable
image.pngimage.png
image.png image.png
就写法来说,Serializable比较省事,直接implements下就行,Parcelable我还要多按个快捷键,多麻烦呀,而且我在手动加上transient修饰的变量时候也是可以能成功序列化和反序列化的.那这两种区别到底在哪呢?
总结:
- Serializable的作用是为了保存对象的属性到本地文件,数据库,网络流以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的.使用了反射技术,并且期间产生临时对象.Serializable序列化不保存静态变量,可以使用transient关键字对部分字段不进行序列化,也可以重写writeObject,readObject方法实现序列化自定义.
- Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体.
- 如果两个activity之间需要传递对象到底选择哪个呢,要知道Bundle可是有大小限制的,可千万别整一堆bitmap或者很大的图搞这种,不然就等着报错吧,Serializable是Java 的序列化接口,虽然用起来简单但开销很大,序列化和反序列化都需要大量的 I/O 操作;而 Parcelable是Android提供的序列化方式,因此更适合于 Android 平台上,它的缺点是使用起来稍微麻烦点,但它效率高呀,现在android手机内存那么大,用这一点来换取效率我觉得还是挺值得,而且这也是 Android 推荐的序列化方式,因此首选当然是Parcelable.但 Serializable也可能会用到,比如:需要将对象序列化到硬盘存储;对象序列化后网络传输。