java序列化是什么,是怎么实现的,为什么要序列化?
我们知道,无论是保存文本,图片还是视频等资源到硬盘上时,是无法直接将字符串,图片保存到硬盘上的,我们只能将这些资源转化为字节之后才可以保存到硬盘上,也就是数据的持久化。同理从硬盘中读取的数据也是字节,需要将字节转化为我们需要的格式。(字符流读取字符串时,也是在内部将字节转化为字符,字符流只能够读取字符,而字节流几乎可以读取所有资源)
java序列化是将java对象转化为字节,将java对象转化为字节之后,才可以将java对象保存到硬盘上,也就是将java对象持久化。利用序列化实现远程通信,即在网络上传送对象的字节序列。反序列化即将字节序列转化为简单易懂的java对象。
通过writeObject(object)可以将java对象转化为字节序列,并且写入到硬盘上,通过readObject可以将字节序列转化为java对象,并且将其返回。
通过实现Serializable或Externalizable接口,可以将java对象序列化。
使用transient关键字修饰的属性将不会被序列化。
下面是序列化与反序列化的具体例子
下面是Student实体对象
package com.xfl.io;
import java.io.Serializable;
public class Student implements Serializable{
private String stuno;
private String stuname;
//该元素不会进行jvm默认的序列化,也可以自己完成这个元素的序列化
private transient int stuage;
public Student(String stuno, String stuname, int stuage) {
super();
this.stuno = stuno;
this.stuname = stuname;
this.stuage = stuage;
}
public String getStuno() {
return stuno;
}
public void setStuno(String stuno) {
this.stuno = stuno;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public int getStuage() {
return stuage;
}
public void setStuage(int stuage) {
this.stuage = stuage;
}
@Override
public String toString() {
return "Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage="
+ stuage + "]";
}
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
s.defaultWriteObject();//把jvm能默认序列化的元素进行序列化操作
s.writeInt(stuage);//自己完成stuage的序列化
}
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException{
s.defaultReadObject();//把jvm能默认反序列化的元素进行反序列化操作
this.stuage = s.readInt();//自己完成stuage的反序列化操作
}
}
将对象序列化与反序列化
package com.xfl.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectSeriaDemo1 {
public static void main(String[] args) throws Exception{
String file = "demo/obj.dat";
//1.对象的序列化
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(file));
Student stu = new Student("10001", "张三", 20);
oos.writeObject(stu);
oos.flush();
oos.close();
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(file));
Student stu2 = (Student)ois.readObject();
System.out.println(stu2);
ois.close();
}
}