背景: 抽空整理一下.特此纪要!
问题:
1. transient是什么?
2. transient关键字能做什么?
3. transient底层实现原理是什么?
解答:
1. transient是什么?
transient是java中的一个关键字.
2. transient关键字能做什么?
transient关键字用来修饰不需要序列化的对象属性,当对象的某个属性被transient关键字修饰后,序列化这个对象的时候,这个属性就不会被序列化.
3. transient底层的实现原理是什么?
java的serialization提供了一种存储对象状态的机制.将对象的状态数据存储到磁盘,等需要的时候将其取出来.而某些业务场景对于一些特殊的属性不希望在网络上传输,
此时transient关键字就起到了决定性的作用,他可以将被其修饰的对象属性的生命周期限定在内存中,也就是说最终不会被写入到内存.
下面有一则用例,可以快速了解关于序列化的相关内容:
package cn.api.serialize;
import java.io.*;
/**
* Serialize Api 序列化API
* Java序列化是指将java对象转化为字节序列的过程. 而Java反序列化是指将字节序列恢复为java对象的过程.从而达到网络传输,本地存储的效果.
*
* transient关键字的应用
* 序列化的两种方式:
* 1. Serializable
* 2. Externalizable
* Serializable和Externalizable的区别?
* Externalizable实现自Serializable.
* 使用Externalizable序列化需要实现writeExternal()和readExternal().
* 说明: 使用Externalizable实现序列化需要手动提供序列化对象的无参构造器.
* 使用Externalizable序列化不需要产生序列化ID(serialVersionUID),而通过Serializable方式实现序列化时需要初始化序列化ID(serialVersionUID).
* 相对于Serializable,使用Externalizable实现序列化其占用的内存要比Serializable要小,速度也要比Serializable要快.
* Serializable使用两种方式实现序列化[
* 1. 对非transient以及非static的属性进行序列化.
* 2. 实现writeExternal()和readExternal()进行指定属性的序列化.
* ] 说明: Serializable不需要提供序列化对象无参构造器的原因是,Serializable使用反射机制完成内容回复.因此没有一定要添加序列化对象的无参构造器的限制.
* 项目中为了快速响应一般都是用Serializable来完成数据对象的序列化.有些类可以使用Externalizable接口,如: [
* 完全控制序列的流程和逻辑.
* 需要大量的使用序列化和反序列化操作,此时你比较关心资源和性能.(此时也可以通过第三方序列化反序列化工具来实现. 如:protobuf(Google),thrift(Facebook),AvroGeneric...)
* ]
*/
public class SerializeApi {
/**
* Obj User
*/
static class User implements Serializable{