java对象和字节序列的转换过程,序列化需要保证对对象状态的保存和可重建性。
持久化,远程通信序列化算法实现原理
1、递归地输出类的超累描述直到不再有超类的对象实例的类元数据
2、递归地输出对象实例的实际数据值(理论上就是从超类开始的)
本质上讲就是先把描述字段写完,再按顺序将实际数据写一遍
jdk中的api
java.io.ObjectOutputStream // 对象输出流->即序列化
java.io.ObjectInputStream // 对象输入流->即反序列化
想要实现自定义序列化该怎么做?
1、实现Serializable接口,同时自定义readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out)方法。
2、实现Externalnalizable接口,实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法。
可以在对应的方法中自定义序列化和反序列化方法
public static void main(String[] args){
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("C:\\Users\\chaoj\\Desktop\\123\\123.txt"));
objectOutputStream.writeObject(new Demo("aaaa",1,200000000000L));
objectOutputStream.flush();
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
static class Demo implements Serializable{
String a;
Integer b;
Long c;
Demo(String a,Integer b,Long c){
this.a = a;
this.b = b;
this.c = c;
}
}
transient关键字的作用?
在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。但是在实现Externalnalizable接口接口实现序列化的时候该关键字的限定会失效