java序列化是将对象写入字节流,将对象换成字节的表现形式
序列化之后的java对象,可以以字节流形式用于数据持久化操作,以及网络传输。
并且基于jvm平台的存在,序列化之后的字节流可以移植,独立存在运行。
java源码中,该接口就是一个空的,实现这个接口就是类添加标识,jvm实现序列化。
1.标识类对象为Serializabel之后,利用ObjectOutputStream输出流
2.创建输出流对象 Oos,利用writeObject()函数输出序列化结果
3.对于输出序列化结果,可以利用输入流ObjectOutputStream实现
readObject()进行反序列化操作,获取对象
//首先是序列化过程
private static void testSerialize(File file) {
// get A new Person as:
Person newPerson = new Person(24,"Renln",75);
/*
-serialize --- Persistent operation
-Get an object (ObjectOutputStream)
*/
try {
ObjectOutputStream OosObject = new ObjectOutputStream(new FileOutputStream(file));
OosObject.writeObject(newPerson);
OosObject.close();
}catch (IOException e){
e.printStackTrace();
}
}
```
Person对象序列化之后---
sr javaSerializaiton.Person78芋_ I ageI weightL namet Ljava/lang/String;xp Kt Renln
```
//这是反序列化过程
private static Person testDeserialize(File file ) {
//get ByteStream from file ,then Desrialize by ObjectInputStream
Person dnewPerson = new Person();
try{
ObjectInputStream OisObject = new ObjectInputStream(new FileInputStream(file));
dnewPerson = (Person)OisObject.readObject();
OisObject.close();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return dnewPerson;
}
反序列化结果: desrialize:[Person(age=24, name=Renln, weight=75)]
Serializable只是标识类对象为Serializable,真正工作的是ObjectO/FileInputStream中的WriteObject()与readObject()函数
其中函数源代码要求:
// remaining cases
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum<?>) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
从上述代码可知,如果被写对象的类型是String,或数组,或Enum,或Serializable,那么就可以对该对象进行序列化,否则将抛出NotSerializableException。
- 函数提供关键字transient
- Static常量也不被序列化
创建新的对象: Person newPerson = new Person(24,“Renln”,75,“秘密不可说”);
序列化结果: sr javaSerializaiton.Person敡覞輤鋖 I ageI weightL namet Ljava/lang/String;xp Kt Renln
反序列结果为: desrialize:[Person(age=24, name=Renln, weight=75, screet=null)]
设置screet字段为 transient之后,对比可发现其属性为:null
1.查看序列化结果,可以发现String类型数据可以直接被读取,传输过程中是否出现遗失??窃取??
2.利用Externalizable实现序列化(Serializable子类)